Regulární výrazy nahrazování znaků php. Regulární výrazy v php

Začněme tím, co je regulární výraz. Odpovězte mi tedy na tuto otázku: je ve slově „test“ „e“? "Jíst!" říkáš. Pak se tě zeptám na druhou otázku, jak jsi našel písmeno "e" ve slově "test"? Odpověď je zřejmá, vezmeme první znak, tedy „t“ a porovnáme ho s tím, co hledáme, tedy s „e“. Pokud se nerovnají, vezmeme druhý znak, tedy „e“, a porovnáme ho s tím, co hledáme, tedy „e“. Voila! Byla nalezena shoda. Odpověď: Slovo "test" obsahuje písmeno "e".

Nyní mi odpovězte ještě na jednu otázku, kde je regulární výraz v tomto příkladu? Doufám, že jste uhodli, že regulární výraz je to, co hledáme ve slově „test“. To znamená, že písmeno "e" v tomto příkladu je regulární výraz.

K čemu se v PHP používají regulární výrazy? V mé praxi se regulární výrazy používaly například pro zjištění, zda je emailová adresa složena správně. Tyto výrazy se také používají k určení správnosti uživatelského jména a hesla. Pomocí regulárních výrazů můžete najít adresu v odkazu a uložit ji. Existuje mnoho věcí, které můžete udělat, když to analyzujete, můžete identifikovat hlavní funkci regulárních výrazů a dvě vedlejší. Hlavní funkce, toto je hledání shod v řetězci. Mezi vedlejší efekty patří ukládání nalezených shod a jejich nahrazení.

První regulární výraz

Teoreticky rozumíme tomu, jak najít znak "e" ve slově "test", ale jak je to implementováno v praxi? Pro použití regulárních výrazů v php se obvykle používají následující funkce:

preg_match("regulární výraz (vzor)", "proměnná, ve které se provádí vyhledávání", "Proměnná, ve které je uložen výsledek vyhledávání (volitelný parametr)"); - Funkce párování
preg_replace("regulární výraz (vzor)", "Čím nahradit nalezenou shodu", "proměnná, do které se provede nahrazení"); - Vyměnit funkci

Začněme používat tyto funkce Zde je příklad hledání znaku "e" ve slově "test":

$a = "test";
if(preg_match("/e/",$a)) echo "nalezeno!!";

Kód popisuje podmínku: pokud je v proměnné $a nalezeno něco, co odpovídá vzoru, zobrazí se zpráva „nalezeno!!“ Jak jste si možná všimli, naše šablona se nachází mezi dvěma "/". V tomto případě symbol "/" symbolizuje začátek a konec našeho vzoru. Doufám, že je to jasné.

To vše je samozřejmě zajímavé... ale naše šablona je velmi jednoduchá, nemyslíte? Málokdy totiž potřebujeme najít nějaký symbol v proměnné. Ve většině případů potřebujeme najít mnoho postav, a také neznámých. Jak to může být? Položme si problém a pokusme se ho vyřešit. Předpokládejme, že máme řetězec složený z čísel a jednoho neznámého anglického písmene

Jak najít tento dopis? Mohlo by tam být jakékoli písmeno anglické abecedy, tak jak ho můžete identifikovat? Sám jste si odpověděl na svou otázku, existuje nějaké písmeno, to znamená, že je v rozsahu od a do z. V regulárních výrazech můžete použít rozsahy. Pokud nevíme, jaký znak hledáme, ale s jistotou víme, že tento znak je písmenem anglické abecedy, záznam bude následující:

$a = "123a321";
if(preg_match("//",$a)) echo "nalezeno!!";

Všimněte si, že rozsah je uzavřen v závorkách "[" "]". Vše, co je uzavřeno v těchto závorkách, je definováno jako jeden symbol, v tomto případě se symbol pohybuje od a do z. Pokud potřebujeme najít ne písmeno, ale číslo, bude záznam vypadat takto:

$a = "abc1cba";
if(preg_match("//",$a)) echo "nalezeno!!";

Chci také poznamenat, že regulární výrazy rozlišují velká a malá písmena, takže znaky „A“ a „a“ jsou zcela odlišné, pro hledání obou znaků napište takto:

$a = "123a321";
if(preg_match("//",$a)) echo "nalezeno!!";

Existuje také vyhledávání ruských písmen, které se provádí stejným způsobem jako u anglických:

$a = "123×321";
if(preg_match("/[a-zA-Z]/",$a)) echo "nalezeno!!";

Metaznaky

Naučili jsme se hledat neznámý znak v řetězci. Co dělat, když potřebujeme najít několik postav? Na pomoc přijdou takzvané metasymboly... Předpokládejme, že máme řetězec s čísly a písmeny, jak jej můžeme popsat v šabloně? Můžete to udělat takto:

řádek - 123a321
vzorek -

Hmm... šablona skutečně odpovídá našemu řetězci, a když se zkontroluje, zda vyhovuje, splní dlouho očekávanou pravdu! Ale je to trochu těžkopádný záznam, nemyslíte?

Zde je návod, jak to zkrátit:

řádek - 123a321
ukázka - *

Zdá se mi, že je kratší. Jaký je symbol „*“? Jedná se o stejný metasymbol, to znamená, že symbol, který jsme popsali (jmenovitě symbol, který může obsahovat čísla od 0 do 9 nebo písmena anglické abecedy od a do z), se může opakovat neomezeně dlouho nebo vícekrát. Ano ano! Tento metasymbol najde shodu v prázdné proměnné, protože i absence symbolu, který jsme popsali, vrátí hodnotu true! Pamatujte si to

Jaké další metaznaky existují?

Například metaznak "+" Je téměř podobný metaznaku "*" s jednou malou výjimkou. "*" vrátí true, i když tam není žádný znak, a "+" zkontroluje přítomnost alespoň jednoho znaku. Tedy pokud linka vyžaduje přítomnost minimální jeden znak pak použijte "+" místo "*"

Často se také používá metaznak "?" To znamená, že řádek nesmí obsahovat více než jeden požadovaný znak. Dovolte mi uvést několik příkladů pro poslední dva metaznaky, které jsem popsal.

Předpokládejme, že potřebujeme zkontrolovat správnost hesla uživatele. Zamysleme se nad tím, co by mělo obsahovat uživatelské heslo? No, za prvé to musí být alespoň jedna postava. Za druhé, musí obsahovat pouze čísla a písmena anglické abecedy, takže regulární výraz bude vypadat takto:

$a = "qwerty12345";

Jaké postavy povolujeme? Anglická písmena všech pádů a číslic. Nyní zkuste místo hesla nechat prázdný řádek.

$a = "";
if(preg_match("/+/",$a)) echo "Heslo je správné";

Neuvidíte zprávu „Heslo je správné“. Proč? Protože metaznak "+" zkontroloval řetězec, zda má alespoň jeden znak.

A teď malý trik, pojďme se podívat na náš výraz, nedovolili jsme si, no, řekněme mezeru v něm, ne? dejte na konec hesla mezeru a spusťte

$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "Heslo je správné";

A proč vidíme naši zprávu o správném hesle? Je to celkem jednoduché... Funkce preg_match(); zastaví jeho kontrolu při prvním zápase. To znamená, že symbol „q“ odpovídá vzoru, který jsme popsali, a vše ostatní již není pro funkci důležité. Co bychom měli dělat? Zde je návod, jak to opravit:

$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "Heslo je správné";

Přidáním "^" na začátek výrazu a "$" na konec sdělíme funkci, čemu by měl vzor odpovídat všečára. Pokud spustíte tento kód, neuvidíte zprávu, protože na konci hesla je neplatný znak - mezera

Nyní změňte metaznak "+" na metaznak "?". co myslíš, že se stane? Správně se nezobrazí žádná zpráva o správnosti hesla, protože heslo obsahuje více než jeden znak. Doufám, že jsem správně vysvětlil práci těchto tří často používaných metaznaků

Někdy je lepší "ne".

Alespoň jsme se naučili, jak zkontrolovat správnost hesla, a to je dobře! Řeknu vám o jiném způsobu hledání něčeho v řetězci. Řekněme, že potřebujeme zkontrolovat nepřítomnost čísel v řetězci. Jak to udělat? Tady je řádek:

(Konkrétně jsem do toho vložil tyto symboly „-_+()“, aby se život nezdál jako med...) Mohli bychom formulovat následující výraz:

Ale musíte uznat, že ne vždy víme, jaké znaky jsou použity v řádku, ale víme jistě, že by v něm neměla být čísla! Logičtější by proto bylo jednoduše napsat šablonu, která by přeskakovala řádky, ve kterých Žádnýčísla, a ne ta, ve kterých je "Ach můj bože, kolik nepochopitelných symbolů!!!". Zde je příklad správně složeného výrazu pro takové problémy:

$a = "a-_+()";
if(preg_match("/^[^0-9]+$/",$a)) echo "Žádná čísla!";

Jak jsme toho dosáhli? Zadali jsme symbol Ale! velká část "^" ([^0-9]) umístěná na začátku znamená, že bude neměl by Doufám, že se to vyřešilo

No, pomalu to zabalíme... Uvedu dva příklady s vysvětlením, při kterých se naučíme uložit výsledek hledání do proměnné a naučíme se, jak zkontrolovat správnost poštovní adresy

Viděl jsem to a uložil jsem to!

Můj blog

$a = " Můj blog";
preg_match("/ /", $a);

V našem regulárním výrazu jsme popsali všechny možné znaky, které lze do odkazu zahrnout. Chci také věnovat pozornost uvozovkám a znakům „/“ v našem výrazu Předchází jim zpětné lomítko, k čemu to je? Faktem je, že „/“ a citace jsou samy o sobě speciální znaky. A aby je šablona vnímala jako obyčejné symboly, musíme je promítat. Escape se provádí přidáním zpětného lomítka před speciální znaky. Doufám, že je to jasné

$a = " Můj blog";
preg_match("/ /", $a, $b);

No a podle toho je potřeba přidat další parametr v podobě proměnné $b, do které se nalezený odkaz uloží. Musíte také vědět, že výsledek hledání je umístěn v poli. Proto je proměnná $b pole. Informace, kterou hledáme, je pod indexem 1. To znamená, že výsledek hledání je v proměnné $b. Ukážeme výsledek na obrazovce:

$a = " Můj blog";
preg_match("/ /", $a, $b);
echo $b;

Správná adresa je klíčem k úspěchu!

A nakonec odpověď na otázku, je e-mail správný? Nejprve musíte vědět, jaké znaky jsou povoleny v adresách? Pokud vím, mezi povolené znaky patří:

  • Anglická písmena, čísla, „_“, „-“ ummmm všechno se zdá být... ​​Budeme vycházet z tohoto.
  • Dále máme "@"
  • Poté anglická písmena
  • Dále tečka
  • A zase anglická písmena...

Regulární výraz tedy bude vypadat takto:

$a = " [e-mail chráněný]";
if(preg_match("/^+@+.+$/", $a)) echo "e-mailová adresa je správná!";
else echo "e-mailová adresa NENÍ napsána správně!";

No... doufám, že vás takové záznamy teď nevyděsí a docela jim rozumíte.

Na závěr chci něco říct. Článek se ukázal jako těžkopádný a přitom pokryl jen část možností. Pokud čtete tuto větu, tak jste ji s největší pravděpodobností dočetli až do konce, za což vám moc děkuji

Pokud jde o sérii článků o vývoji blogu cms, první část série Prohlašuji to za uzavřené! V blízké budoucnosti začneme implementovat admin panel, takže „nepřepínejte“ Pokud máte nějaké dotazy, rád odpovím. Všechno nejlepší, to je vše, co mám!


Jednou z velmi výkonných a užitečných funkcí jazyka PHP je jeho podpora regulárních výrazů. Mnoho programátorů, začátečníků i docela zkušených, se bojí zjevné složitosti a složitosti jazyka regulárních výrazů. Ale mohu vás ujistit - stojí to za to. Použití regulárních výrazů značně zjednodušuje práci při zpracování textů a slabě strukturovaných dat.


Regulární výrazy jsou výrazy napsané ve speciálním jazyce. Nelekejte se, jazyk je docela snadno srozumitelný, vše, co potřebujete, jsou zkušenosti a praxe.


Myslím, že jste se opakovaně setkali se situacemi, kdy máte text (např. v Microsoft Wordu) a potřebujete v něm něco důležitého najít. Pokud víte, co přesně hledáte, vše je jednoduché: vyvolejte vyhledávací dialog, zadejte hledané slovo, stiskněte tlačítko a voila - text je nalezen.


Co ale uděláte, když předem znáte pouze typ informace, kterou hledáte? Stojíte například před úkolem najít všechny e-mailové adresy v dokumentu o několika stovkách listů. Někdo si dokument prohlédne ručně, někdo zadá do vyhledávání psa (@) a vyhledá ho. Souhlasím - obě možnosti jsou zvrácená, nevděčná práce.

Zde na pomoc přicházejí regulární výrazy. K určité aproximaci lze regulární výrazy přirovnat k maskám nebo šablonám, které jsou překryty textem: pokud text odpovídá masce, pak je to požadovaný fragment. Než se však zamyslíme nad použitím regulárních výrazů, seznámíme se s jejich syntaxí.

Regulární výraz je textový řetězec složený podle určitých zákonů a pravidel. Řetězec se skládá ze znaků a skupin znaků, metaznaků, kvantifikátorů a modifikátorů.

V tomto případě symboly znamenají jakékoli symboly libovolné abecedy. A nejen ty čitelné. Do výrazu můžete snadno vložit nečitelný znak, stačí znát jeho kód v hexadecimálním tvaru. Například:

// čitelné znaky a E // nečitelné znaky a kódy \x41 - stejné jako písmeno "A" \x09 - znak tabulátoru

Skupina znaků je několik znaků napsaných postupně:

Abvg ACZms

Hned bych vás chtěl upozornit - „mezera“ v regulárních výrazech je také považována za významný znak, takže buďte opatrní při psaní výrazů. Například tyto skupiny znaků jsou RŮZNÉ výrazy:

ABC KDE ABC KDE

Dalším prvkem jazyka jsou metaznaky. Předpona „meta“ znamená, že tyto symboly popisují některé další symboly nebo jejich skupiny. Tabulka popisuje hlavní metaznaky jazyka regulárních výrazů:

Metaznaky pro specifikaci speciálních znaků
() Závorky. Definuje vnořené výrazy.
| Výběrový metaznak
^ Začátek metaznaku řádku
$ Metaznak konce řádku
\n Znak odřádkování (hexadecimální kód 0x0A)
\r Znak pro návrat vozíku (hexadecimální kód 0x0D)
\t Znak tabulátoru (hexadecimální kód 0x09)
\xhh Vložení znaku s hexadecimálním kódem 0xhh, například \x42 vloží latinské písmeno "B"
Metaznaky pro specifikaci skupin znaků
. Tečka. Jakákoli postava.
\d Číslice (0-9)
\D Není to číslo (jakýkoli znak kromě znaků 0-9)
\s Prázdný znak (obvykle mezera a tabulátor)
\S Neprázdný znak (všechny kromě znaků identifikovaných metaznakem \s)
\w Znak „slovníku“ (znak, který se používá ve slovech. Obvykle všechna písmena, všechna čísla a podtržítko („_“))
\W Všechny kromě znaků definovaných metaznakem \w

Metaznaky z druhé poloviny tabulky jsou velmi snadno zapamatovatelné. "d" - číslice (číslice), "s" - symbol (symbol), "w" - slovo (slovo). Pokud je písmeno velké, musíte do popisu skupiny přidat „NOT“.

Vezměme si například text „Červený dres má čísla 1812 a zelený dres má čísla 2009“. Podívejme se na příklady nejjednodušších regulárních výrazů:

\d\d\d\d - najde 1812 a 2009 \D - najde všechna písmena, mezery a interpunkční znaménka \s - najde všechny mezery v textu.

Ale rok v našem příkladu může být zapsán ne čtyřmi, ale dvěma číslicemi, slova mohou mít jiné skloňování atd. Zde mohou pomoci podmnožiny znaků, které jsou specifikovány pomocí hranatých závorek:

Znamená jakoukoli číslici (stejně jako \d) - znamená sudou číslici - znamená jakýkoli symbol latinské abecedy (v každém případě) nebo číslici.

Například výraz \d\d\d v testovacím řetězci najde pouze 1812, ale ne 2009. Tento výraz by měl být chápán jako „najít všechny sekvence čtyř číslic, kde poslední číslice je 0,2,4,6 nebo 8".

Jediné, co nám zbývá zmínit, jsou kvantifikátory a modifikátory.

Kvantifikátor je speciální konstrukce, která určuje, kolikrát se musí postava nebo skupina postav objevit. Kvantifikátor je zapsán ve složených závorkách "()". Jsou možné dva formáty záznamu: přesný a rozsahový. Přesný formát je napsán takto:

Zde X je počet, kolikrát se musí předchozí symbol nebo skupina opakovat. Například výraz

Druhou formou záznamu je rozsah. Zaznamenáno jako

(X, Y) // nebo (,Y) // nebo (X,)

kde X je minimum a Y je maximální počet opakování. Například:

čteno jako "dvě až čtyři číslice zapsané v sekvenci." Není-li jedna z hranic specifikována, pak se nepředpokládá žádné omezení. Například:

\w(3,) - tři nebo více písmen. \d(,5) - neexistují žádná čísla, nebo jsou, ale ne více než pět.

Kvantifikátory lze použít buď na jeden znak, nebo na skupinu:

[A-Yaa-ya] (1,3)

Tato konstrukce vybere z textu všechna ruská slova o jednom, dvou nebo třech písmenech (například „nebo“, „ne“, „já“, „jdu“ atd.)

Kromě složených závorek existují další tři metaznaky kvantifikátoru: „*“ (hvězdička), „+“ (plus) a „?“ (otázka). Používají se v případech, kdy není předem znám minimální a maximální počet požadovaných opakování. Například při vyhledávání e-mailových adres nemůžete předem říci, kolik znaků bude v uživatelském jménu (před "pes") a kolik bude v názvu domény (za "pes").

Metaznak "*" se čte jako "jakékoli množství od nuly nebo více", tzn. design

definuje libovolný počet po sobě jdoucích písmen, včetně jejich úplné absence.

Symbol „+“ se od hvězdičky liší pouze tím, že vyžaduje přítomnost alespoň jednoho znaku. Tito. design

odpovídá libovolné digitální sekvenci s jednou nebo více číslicemi.

Symbol "?" odpovídá nepřítomnosti nebo přítomnosti jednoho znaku. Tito. design

odpovídá libovolné digitální sekvenci s jednou nebo dvěma číslicemi.

Zde stojí za zmínku taková vlastnost antiifiers „*“ a „+“ jako chamtivost. Jde o to, že standardně tyto znaky odpovídají nejdelší možné sekvenci znaků. Například pro řádek „máma umyla rám“ výraz:

vybere „mama soap ra“, což je poněkud nečekané, protože jsme očekávali, že dostaneme „ma“. Chcete-li toto chování změnit, použijte metaznak "?" (otazník) napsaný bezprostředně za kvantifikátor. Omezuje "chuť k jídlu" kvantifikátorů tím, že je nutí vrátit první shodu spíše než nejdelší. Nyní změníme předchozí příklad:

a získejte požadovanou shodu "ma".

Posledním prvkem jazyka je modifikátory. Modifikátor je speciální znak, který definuje „systémové“ parametry pro analýzu regulárních výrazů. Existují pouze čtyři takové symboly, lze je používat jednotlivě nebo současně:

i Povolí režim bez rozlišení velkých a malých písmen, tj. velká a malá písmena ve výrazu se neliší.
m Označuje, že hledaný text by měl být považován za sestávající z více řádků. Ve výchozím nastavení modul regulárních výrazů zachází s textem jako s jedním řetězcem bez ohledu na to, co ve skutečnosti je. V souladu s tím metaznaky "^" a "$" označují začátek a konec celého textu. Pokud je tento modifikátor zadán, pak budou označovat začátek a konec každého řádku textu.
s Výchozí metaznak je "." nezahrnuje do své definice znak nového řádku. Tito. u víceřádkového textu vrátí výraz /.+/ pouze první řádek, nikoli celý text podle očekávání. Zadáním tohoto modifikátoru toto omezení odstraníte.
U Všechny kvantitativní metaznaky jsou ve výchozím nastavení „nenasytné“. V některých modifikacích jazyka (zejména v PHP) se místo „U“ používá znak „g“, což více odpovídá významu („g“ je zkratka anglického „greedy“, „greedy“ ).

Tabulka ukazuje nejoblíbenější a potřebné příklady regulárních výrazů. Některé se vám mohou zdát složité a těžkopádné, ale při podrobném studiu je nepochybně pochopíte.

Regulární výrazy v PHP.

Pro práci s regulárními výrazy v PHP existují speciální funkce, jejichž seznam a stručný popis jsou uvedeny v tabulce:

int preg_match (vzor řetězce, předmět řetězce [, shody pole])

Funkce kontroluje, zda obsah předmětu odpovídá vzoru. Vrátí 1, pokud jsou nalezeny shody, jinak vrátí 0. Pokud zadáte volitelný parametr pole shody, pak při provedení funkce do něj bude vložen jediný prvek – první nalezená shoda.

"; print_r($found); ?>

int preg_match_all (vzor řetězce, předmět řetězce, shodu pole [, int order])
Funkce je totožná s předchozí, jen s tím rozdílem - prohledá celý text a vrátí VŠECHNY nalezené shody v poli matchs.
smíšené preg_replace (smíšený vzor, ​​smíšené nahrazení, smíšený předmět [, limit int])
Stejně jako obě předchozí funkce, preg_replace hledá část textu, která odpovídá vzoru. Funkce nahradí všechny nalezené fragmenty textem uvedeným v parametrech.Před čištěním:\n$text\n\n"; $text = preg_replace("/(\n \s(2,))/"," ",$text); echo " Po vyčištění:\n$text"; // zobrazí text bez speciálních znaků // a mezer navíc?>
smíšené preg_replace_callback (smíšený vzor, ​​smíšené zpětné volání, smíšený předmět [, limit int])
Funkce je rozšířenou verzí předchozí. Hlavní rozdíl je v tom, že této funkci je předán v parametrech název funkce, která bude analyzovat text a generovat náhradní text.
pole preg_split (vzor řetězce, předmět řetězce [, limit int [, příznaky int]])
Tato funkce je podobná funkcím explode() a split(). Jeho zvláštností je, že oddělovač není pevný řetězec, ale regulární výraz. Funkce rozdělí zdrojová data na prvky a umístí je do výstupního pole.
pole preg_grep (vzor řetězce, vstup pole)
Funkce je určena pro běžné vyhledávání v polích. Pro vyhledávání je zadána šablona a pole vstupních dat a je vráceno pole sestávající pouze z prvků, které odpovídají šabloně.

Výčet uvažovaných funkcí není zdaleka úplný, ale pro úspěšný začátek práce s regulárními výrazy zcela postačuje. Pokud vás toto téma zajímá, určitě si přečtěte další literaturu (například Friedlovu knihu „Regulární výrazy“). Pro účely školení navíc doporučuji nainstalovat některý ze speciálních programů pro testování regulárních výrazů (například „PCRE“ nebo „RegEx Builder“).

Regulární výrazy jsou velmi výkonným, ale zároveň těžko pochopitelným nástrojem pro zpracování řetězců. Popíšu hlavní body. Regulární výraz je vzor řetězce. Pomocí této šablony můžete vyhledávat výskyty, provádět nahrazování a kontrolovat shodu se šablonou.

Pravidla pro vytváření vzoru

Hranice šablony musí být označeny určitými symboly, často pomocí " / ", ale raději používám" # " protože množství dopředných/zpětných lomítek může oslnit vaše oči a hashovací značky se obvykle nikde jinde nepoužívají. Takže: " #HereBodyRegularExpression#"

Závorky se používají uvnitř regulárního výrazu – jedná se o podvýrazy, se kterými lze manipulovat, například:

#^/catalog/(+)/(+)\.html.*#

Tento výraz je navržen tak, aby získal parametry v řetězci URL. Na začátku řádku je speciální znak " ^ " - to znamená začátek řádku. Následuje " /katalog/" - zde nejsou žádné speciální znaky, jedná se pouze o text, který by měl být obsažen v řádku. Poté jsme narazili na závorky, tj. dostali jsme se na první podvýraz. Hranaté závorky označují mnoho znaků, které mohou být v tomto místě v řádku. Znak " - " znamená výčet. Znamení " \ " uniká speciálním znakům. V prvním podvýrazu tedy můžeme mít VELKÁ KAPITÁLKA a malá písmena latinské abecedy, čísla od 0 do 9, podtržítko, pomlčku a tečku. Pomlčka a tečka jsou speciální znaky, ale zde jsou uvozeny, takže zde jsou pouze symboly za hranatými závorkami je znak ". + " - to znamená, že předchozí znak (a pro nás je to sada znaků specifikovaných v hranatých závorkách) se může objevit jednou nebo vícekrát. Pak přijde " / "je jen symbol a podobný druhý podvýraz. Pak přijde" \.html"co ten text znamená" .html". A pak speciální znaky" .* "Tečka znamená jakýkoli znak a hvězdička znamená libovolné množství předchozího znaku. To znamená po " .html„Všechno může jít.

Indikace množství, kvantifikátory

Výše jsme již uvažovali o takových symbolech udávajících počet předchozích symbolů, jako je např + A * . Zde jsou všechny možnosti pro určení množství:

Speciální znaky

Pro některé skupiny znaků existují speciální zkratky:

"Chamtivost"

Podívejme se na koncept regulárního výrazu chamtivost. Existuje například řádek:

#()#

Čteme: podvýraz:

Vše se zdá být v pořádku, podvýraz sedí:

Ale také se hodí:

To je to, co dostaneme, protože... Regulární výrazy jsou ve výchozím nastavení chamtivé. Chamtivost můžete odstranit pomocí modifikátoru " U", takhle:

#() #U

Modifikátory

Za regulárním výrazem mohou následovat modifikátory: " #HereBodyRegularExpression#HereModifiers"Typy modifikátorů:

i Povolí režim bez ohledu na velikost písmen, tj. velká a malá písmena se ve výrazu neliší.
m Označuje, že hledaný text by měl být považován za sestávající z více řádků. Ve výchozím nastavení modul regulárních výrazů zachází s textem jako s jedním řetězcem bez ohledu na to, co ve skutečnosti je. V souladu s tím metaznaky "^" a "$" označte začátek a konec celého textu. Pokud je tento modifikátor zadán, pak budou označovat začátek a konec každého řádku textu.
s Výchozí metaznak je " . " nezahrnuje ve své definici znak nového řádku. Zadáním tohoto modifikátoru toto omezení odstraníte.
U Odstraňuje chamtivost regulárních výrazů
u Umožňuje práci s regulárními výrazy Cyrilice na UTF-8, jinak nefunguje správně.

php Funkce pro práci s regulárními výrazy

preg_replace

Hledat a nahradit:

Preg_replace (smíšený $vzor , smíšený $náhrada , smíšený $předmět [, int $limit = -1 [, int &$počet ]]);

Každá hodnota může být řetězec nebo pole, v případě $předmět pole - je vráceno pole, jinak řetězec

preg_split

Rozdělí řetězec pomocí regulárního výrazu:

Preg_split (řetězec $vzor , řetězec $předmět [, int $limit = -1 [, int $příznaky = 0 ]]);

Vrátí pole skládající se z podřetězců daného řetězce podrobit, který je rozdělen podél hranic odpovídajících vzoru vzor.

) Ukázal jsem vám příklad použití regulárních výrazů k nalezení konkrétních částí zdrojového kódu stránky. Nyní se naučíme, jak je psát sami. Tato dovednost vám pomůže psát, čistit text od nepotřebných fragmentů, hledat potřebné části ve velkých objemech textu a tak dále.

Toto téma je poměrně složité, ale pokusím se stručně pokrýt nejdůležitější body. Nevím, jak budu úspěšný, ale doufám, že lekce bude užitečná.
Začněme tedy tím, že v PHP existuje několik funkcí pro práci s regulárními výrazy, ale nejčastěji se používají tři:

  • preg_replace — vyhledá a nahradí text odpovídající regulárnímu výrazu;
  • preg_match - pouze běžné vyhledávání;
  • preg_split - vyhledávání a rozdělení textu.

Alespoň v předchozích lekcích jsme je používali. Přesněji, místo preg_match tam byl preg_match_all, ale to je v podstatě to samé, jen to druhé nepřerušuje hledání po prvním nálezu. To znamená, že pokud použijeme preg_match, nenajdeme všechny výskyty, ale pouze první.

Výběr funkce, která se v které situaci použije, je poměrně jednoduchý. Potřebujeme nahradit - používáme nahradit, jako v případě, kdy jsme potřebovali odstranit nepotřebné části kódu stránky, pamatujete?

$page = preg_replace("/ ^]/i", "", $stránka); $stránka = preg_replace("/ ^]/i", "", $stránka); $stránka = str_replace("", "", $stránka);

Prvním parametrem funkce je regulární znak, který určuje, co hledáme. Druhým je to, čím ho nahradíme. Za třetí – Kam se díváme? Proto jsme zde vzali proměnnou $page a přiřadili jí výsledek funkce preg_replace, kde jsme hledali všechny input type=checkbox a také otevírací a uzavírací popisky. Nahradili je „, to znamená, že je jednoduše smazali. Doufám, že je zde vše jasné. K rozboru samotného výrazu (prvního parametru funkce) přejdeme o něco později.
Byl tam také příklad použití preg_match_all, který byl užitečný pro nalezení všech odkazů ve zbývajícím textu. Potřebovali jsme tehdy odkazy, protože obsahovaly klíčová slova, která jsme analyzovali. Co se stalo:

Preg_match_all("/ ]+?>(.*?)<\/a>/uis",$page,$ok); pro ($j=0; $j ".$ok[$j].""; }

Prvním parametrem je opět regulární výraz pro nalezení všech odkazů, které jsou přirozeně uzavřeny ve značce „a“ (pokud se nevyznáte v html značení, tak čtěte). Druhá je proměnná, která obsahuje text, který se bude hledat. Třetím parametrem je proměnná, do které se umístí výsledek – $ok. Poté už zbývá jen projít všechny nezbytné prvky $ok, abychom získali klíčové úlovky, které potřebujeme. Samostatně je třeba říci, že na výstupu dostaneme vícerozměrné pole. Proto jsme to zobrazili tak komplexně: $ok[$j]. Pro zobrazení struktury pole použijte funkci níže a vše pochopíte.

Print_r($ok);

Zdá se, že jsme si utřídili funkce, které jsme pro naši práci používali. Nyní zbývá jen naučit se psát tyto stejné regulární výrazy, které jsou prvním parametrem každé z těchto metod. Přejděme k tomu nejdůležitějšímu.

Jak psát pravidelné věty

Nejprve se podívejme na základní struktury. Výrazy mají možnosti. Jsou specifikovány jedním písmenem a psány na konci, před kterým je lomítko.

Kromě toho jsou podporovány následující metaznaky:

Metaznaky zase mohou mít modifikátory:

Nyní můžeme přejít k analýze našich pravidelných vzorců z minulé lekce. Na základě výše uvedených znaků se pokusme pochopit, co máme. Zde je výraz:

/^]/i

První a poslední lomítko „/“ značí, že se v nich nachází regulární výraz. Zároveň za poslední vložíme „i“, jedná se o možnost, jako v první tabulce - nebereme v úvahu případ. Uvnitř lomítek je samotná pravidelná sekvence. Začíná znaménkem menší než a vstupní značkou a vše, co následuje po tečce, je pouze prostý text, který je třeba hledat. Zajímavější je ale samotná tečka a symboly za ní. V tomto případě konstrukce „.*?“ znamená libovolnou sekvenci znaků. To znamená, že pokud spojíme pouze text a tuto konstrukci, vybereme veškerý text po prvním výskytu až do konce. Chcete-li zastavit, musíte narazit buď na uzavírací značku HTML „více než“, nebo na znak nového řádku. Tento design nám dává právě takovou příležitost:

Znaky v hranatých závorkách jsou spojeny logickým NEBO. Konec je znaménko větší než NEBO začátek řádku.
To je celý výraz, v něm nastavujeme počáteční, střední a koncovou podmínku. Není to těžké, že? Zde je ilustrace pro názornost:

Podívejme se ještě na jednu věc, abychom vše zpevnili. Hledali jsme s nimi odkazy:

/]+?>(.*?)<\/a>/uis

Přečteme výraz. Opět nejprve zahodíme lomítka a možnosti. Příznaky "uis" jsou samozřejmé, kromě "u", které jsem nepopsal - ukazuje, že používáme kódování Unicode. Moc toho nezbylo. Začátek je značka "a", která se otevře, pak přichází třída

což znamená NE větší nebo menší než (otvírání a zavírání HTML tagů), tedy v tomto případě libovolné znaky. Do třídy se přidá „+?“, což znamená, že tato třída bude přítomna 1x nebo vícekrát (alespoň 1x určitě). A pak přichází závěrečná html značka pro značku „a“. Uvnitř odkazu je text určený skupinou

Koneckonců nevíme, jaký druh textu tam bude, takže definujeme takovou skupinu. A na konci je uzavírací značka „a“:

Upozorňujeme, že lomítko uniká zpětným lomítkem, aby bylo vnímáno jako jednoduchý text.

Fuj. Téma je to opravdu dost složité, chce to cvik. Možná dělám něco ne úplně optimálně a je možné vytvořit jiné, správnější regulární výrazy, ale jsem samouk jako vy, takže nesuďte přísně, ale raději se podělte o své možnosti v komentářích. Pokud vám něco není jasné, jsou vám k dispozici komentáře a kontaktní stránka.




Nahoru