Regulárne výrazy php if. Regulárne výrazy v PHP. Kedy na testovanie nepoužívať regulárny výraz

  • 03.11.2019

PHP regexp je výkonný algoritmus na porovnávanie vzorov, ktorý možno vykonať v jedinom výraze. Regulárne výrazy PHP používajú aritmetické operátory (napríklad +, -, ^) na vytváranie zložitých výrazov.

Na čo sa používajú regulárne výrazy:

  • Regulárne výrazy uľahčujú identifikáciu údajov reťazca volaním jedinej funkcie. To šetrí čas pri vytváraní kódu;
  • Pri overovaní údajov zadaných používateľom, ako je e-mailová adresa, doména lokality, telefónne číslo, IP adresa;
  • Zvýrazňovanie kľúčových slov vo výsledkoch vyhľadávania;
  • Regulárne výrazy možno použiť na identifikáciu značiek a ich nahradenie.

Regulárne výrazy v PHP

PHP obsahuje vstavané funkcie, ktoré umožňujú prácu s regulárnymi výrazmi. Teraz sa pozrime na často používané funkcie regulárneho výrazu PHP.

  • preg_match - Používa sa na vykonanie zhody vzorov na reťazci. Vracia true, ak bola nájdená zhoda, a false, ak nebola nájdená žiadna zhoda;
  • preg_split - používa sa na rozdelenie reťazca podľa vzoru, výsledok sa vráti ako číselné pole;
  • preg_replace - používa sa na porovnávanie vzorov a nahradenie zadaným reťazcom.

Nasleduje syntax pre funkcie regulárneho výrazu, ako je preg_match, preg_split alebo náhrada regulárneho výrazu PHP:

Function_name je buď preg_match, preg_split alebo preg_replace.
"/ ... /" - lomky označujú začiatok a koniec regulárneho výrazu.
"'/ Vzor /" "je vzor, ​​ktorý musíme porovnať.
"Objekt" je reťazec, s ktorým sa má vzor zhodovať.

Teraz sa pozrime na praktické príklady použitia vyššie spomínaných funkcií.

Preg_match

Prvý príklad používa funkciu preg_match na vykonanie jednoduchého porovnávania vzorov so slovom guru v danej adrese URL.

Nižšie uvedený kód ukazuje implementáciu tohto príkladu:


Zvážte časť kódu, ktorá je zodpovedná za výstup "Preg_match (' / guru / ', $ my_url)".

"Preg_match (...)" - funkcia PHP zhoda s regulárnym výrazom.
"'/ Guru /" "je vzor regulárneho výrazu.
$ My_url je premenná obsahujúca text, s ktorým sa má vzor zhodovať.

Preg_split

Pozrime sa na ďalší príklad, ktorý používa funkciu preg_split.

Vezmeme frázu a rozdelíme ju do poľa; vzor je určený na vyhľadávanie jedného priestoru:

Preg_replace

Zvážte funkciu preg_replace, ktorá vykonáva zhodu so vzorom a nahrádza nájdený výsledok iným reťazcom.

Nižšie uvedený kód hľadá v reťazci slovo guru. Nahrádza ho kódom css, ktorý nastavuje farbu pozadia:

Guru", $ text); echo $ text;?>

Metaznaky

Vo vyššie uvedených príkladoch boli použité jednoduché šablóny. Metaznaky umožňujú zložitejšie porovnávanie vzorov regulárnych výrazov PHP, ako je napríklad overenie e-mailovej adresy. Poďme sa pozrieť na bežne používané metaznaky.

Metaznak Popis Príklad
. Označuje akýkoľvek jeden znak iný ako znak nového riadku. /./ - čokoľvek, čo obsahuje jeden znak.
^ Označuje začiatok riadku bez znaku /. / ^ PH / - každý riadok, ktorý začína na PH.
$ Označuje vzor na konci riadku. / com $ / - guru99.com, yahoo.com atď.
* Označuje ľubovoľný počet znakov, nula alebo viac. / com * / - počítač, komunikácia atď.
+ Vyžaduje, aby sa znak (y) objavil pred metaznakom aspoň raz. / yah + oo / - yahoo.
Unikajúca postava. /yahoo+.com/ - Bodku berie ako doslovný význam.
[…] Trieda postavy. // - abc.
a-z Označuje malé písmená. / a-z / - v pohode, veselý atď.
A-Z Označuje veľké písmená. / A-Z / - ČO, AKO, PREČO atď.
0-9 Označuje ľubovoľné číslice od 0 do 9. /0-4/ — 0,1,2,3,4.

Teraz sa pozrime na komplexný príklad regulárneho výrazu PHP, ktorý kontroluje platnosť e-mailovej adresy:

Výsledok: e-mailová adresa [e-mail chránený] je platné.

Vysvetlenie šablóny " [e-mail chránený]+. (2,5) $ /] "

„‘ / ... / „“ začína a končí regulárny výraz.
„^“ Zhoduje sa so všetkými malými alebo veľkými písmenami, číslami 0 až 9 a bodkami, podčiarkovníkmi alebo pomlčkami.
« [e-mail chránený]»Zhoduje sa so symbolom @, za ktorým nasledujú malé alebo veľké písmená, čísla 0 až 9 alebo spojovníky.
„+. (2,5) $ /“ označuje bodku pomocou spätnej lomky, potom musia nasledovať všetky veľké alebo malé písmená, počet znakov na konci riadku musí byť medzi 2 a 5.

Popis funkcie:

Funkcia preg_replace hľadá zhody regulárneho výrazu (vzoru) s údajmi v reťazci (predmet) a nahrádza ich údajmi, ktoré sa nahrádzajú.

Argumentovať

Popis

vzor

Požadovaný argument. regulárny výraz (vzor vyhľadávania)

reťazec, pole

výmena

Požadovaný argument. Reťazec alebo pole s údajmi používanými na nahradenie údajov predmet

Tiež pre odkazy môžete použiť konštrukciu ako \ $ (1) ekvivalentné \ $ 1, táto konštrukcia sa použije, ak za odkazom hneď nasleduje číslica (\ $ (1) 1).

reťazec, pole
predmet Požadovaný argument. Reťazec alebo pole s údajmi, ktoré sa majú nahradiť. reťazec, pole
limit

Voliteľný argument. Maximálny počet výmen. Predvolená hodnota je -1 (neobmedzené)

int
počítať

Voliteľný argument. Premenná, ktorá obsahuje počet vykonaných náhrad.

int

Funkciu preg_replace () možno použiť s modifikátorom /e. Ak je tento modifikátor prítomný, parameter nahradzovania sa interpretuje ako kód PHP a potom sa používa na nahradenie.

Regulárne výrazy

Samostatne by som sa mal zaoberať regulárnymi výrazmi, bez ktorých je dosť ťažké (ak nie nemožné) pochopiť, ako funkcia funguje. preg_replace ().

Pomerne dobrý popis regulárnych výrazov je uvedený na wikipedia.org, popísané sú aj hlavné body používania regulárnych výrazov

Príklady:

Príklad 1:

V tomto príklade nahradíme všetky čísla v zátvorkách hviezdičkami.

Príklad 2:

V tomto príklade nahradíme reťazec zodpovedajúci celému vzoru údajmi zodpovedajúcimi prvému podvzoru pri odkaze \ $ 1. Inými slovami, „mať 3 jablká“ zodpovedajúce „/ (\ w +) (\ d +) (\ w +) /“ bude nahradené výrazom „mať“ zodpovedajúce (\ w +).

Príklad 3:

Tento príklad ukazuje, čo sa stane, ak použijete polia ako vzor a náhradu.

Príklad 4:

Tento príklad ukazuje, čo sa stane, ak použijete polia ako vzor, ​​náhradu a predmet.

Príklad 5:

Tento príklad ukazuje použitie modifikátora /e, t.j. keď sa nahradenie interpretuje ako kód php. Nasleduje prevod znakov z malých na veľké písmená.

Príklad 6:

Tento príklad demonštruje použitie argumentu počet. Tu bude výsledok 2, takže došlo k dvom výmenám.

zmiešané preg_match(vzor reťazca, predmet reťazca [, pole a zhody [, príznaky int [, posun int]]])

Vyhľadá predmet v danom texte podľa vzoru

Ak je zadaný voliteľný parameter zhody, vyplní sa výsledkami vyhľadávania. Element $ match bude obsahovať časť reťazca, ktorá sa zhoduje s celým vzorom, $ sa zhoduje s časťou reťazca, ktorá sa zhoduje s prvým podvzorom atď.

príznaky môžu nadobúdať nasledujúce hodnoty:

PREG_OFFSET_CAPTURE

Ak je zadaný tento príznak, pre každý nájdený podreťazec bude označená jeho pozícia v pôvodnom reťazci. Malo by sa pamätať na to, že tento príznak mení formát vrátených údajov: každý výskyt sa vráti ako pole, ktorého nulový prvok obsahuje nájdený podreťazec a prvý obsahuje posun. Tento príznak je dostupný v PHP 4.3.0 a vyšších.

Dodatočný parameter flags je dostupný od PHP 4.3.0.

Vyhľadávanie sa vykonáva zľava doprava, od začiatku riadku. Voliteľný parameter offset možno použiť na určenie alternatívnej počiatočnej pozície pre vyhľadávanie. Voliteľný parameter offset je dostupný od PHP 4.3.3.

komentár: Použitie parametra offset nie je ekvivalentné nahradeniu zhodného reťazca substr ($ predmet, $ offset) vo volaní funkcie preg_match_all () keďže vzor môže obsahovať podmienky ako napr ^ , $ alebo (? ... Porovnaj:

Zatiaľ čo tento príklad

Funkcia preg_match () vráti počet nájdených zhôd. Môže to byť 0 (nenájdená žiadna zhoda) a 1, pretože preg_match () skončí po prvej nájdenej zhode. Ak potrebujete nájsť alebo spočítať všetky zhody, mali by ste použiť funkciu preg_match_all ()... Funkcia preg_match () sa vracia FALSE v prípade, že sa počas vykonávania vyskytli nejaké chyby.

Výzva: Funkciu nepoužívajte preg_match () ak je potrebné skontrolovať prítomnosť podreťazca v danom reťazci. Použite na to strpos () alebo strstr () pretože túto úlohu dokončia oveľa rýchlejšie.


Príklad 2. Hľadanie slova „web“ v texte

/*
Špeciálna postupnosť \ b vo vzore označuje hranicu slova,
preto sa bude zhodovať iba ojedinelý výskyt slova „web“.
maska, na rozdiel od „pavučiny“ alebo „pavučiny“.
*/
if (preg_match ("/ \ bweb \ b / i", "PHP je preferovaný webový skriptovací jazyk.")) {
ozvena "Záznam sa našiel.";
) inak (
ozvena "Nenašiel sa žiadny záznam.";
) preg_match ("/ \ bweb \ b / i", "PHP je zvolený skriptovací jazyk webových stránok.")) {
ozvena "Záznam sa našiel.";
) inak (
ozvena "Nenašiel sa žiadny záznam.";
}
?>
1,6 tis

Regulárne výrazy (skratka - regulárny výraz) sú sekvencie znakov, ktoré tvoria vzory vyhľadávania. Používajú sa hlavne vo vzoroch spájania reťazcov.

Krátky príbeh

  • Všetko sa to začalo v 40. a 60. rokoch 20. storočia, keď veľa šikovných ľudí hovorilo o regulárnych výrazoch;
  • 70. roky 20. storočia g / re / p;
  • 1980 Perl a Henry Spencer;
  • 1997 PCRE (Perl kompatibilné regulárne výrazy). Vtedy sa začalo rozbiehať to, čo nazývame regulárne výrazy. PCRE poskytuje knižnice pre takmer každý jazyk.

Bežné používanie regulárnych výrazov v PHP

PHP obsahuje tri hlavné funkcie pre prácu s PCRE - preg_match, preg_match_all a preg_replace.

Zodpovedajúce porovnanie

Výraz vráti 1, ak bola nájdená zhoda, 0, ak nie, a false, ak sa vyskytne chyba:

int preg_match (reťazec $ vzor, ​​reťazec $ predmet [, pole & $ zhody [, int $ príznaky = 0 [, int $ offset = 0]]])

Príklad regulárneho výrazu, ktorý vráti počet nájdených zhôd:

int preg_match_all (reťazec $ vzor, ​​reťazec $ predmet [, pole & $ zhody [, int $ flags = PREG_PATTERN_ORDER [, int $ offset = 0]]])

Výmena

Výraz vráti nahradený reťazec alebo pole ( na základe predmetu $):

zmiešaná preg_replace (zmiešaný vzor $, zmiešaná náhrada $, zmiešaný predmet $ [, limit int $ = -1 [, počet $ int]])

Bežné používanie regulárnych výrazov v JavaScripte

Regulárne výrazy v JavaScripte vyzerajú takmer rovnako ako v PHP.

Zodpovedajúce porovnanie

Vráti pole zhôd alebo hodnotu null, ak sa nenašli žiadne zhody:

string.match (RegExp);

Výmena

Regulárny výraz, ktorý vracia reťazec s vykonanými náhradami:

string.replace (RegExp, nahradenie);

Vlastnosti regulárnych výrazov v JavaScripte

  • Obdobie sa nikdy nezhoduje s novým riadkom:
  • Rovnaké metódy na porovnávanie a nahradzovanie pomocou regulárneho výrazu ako bez nich.

Zásady písania vzorov regulárnych výrazov

Pozrime sa na príklad, kde chcete nájsť e-mailové adresy vo svojej kódovej základni. Náš cieľ:

Analógové zásuvky

Regulárne výrazy sa skladajú z dvoch typov znakov:

  • Špeciálne symboly: ? * + () () ^ $ /.
  • Doslovy.

Predstavte si vstupné reťazce ako skrutky a šablónu ako sadu konektorov pre ne (v príslušnom poradí).

Špeciálne symboly

Pri overovaní regulárnych výrazov potrebujete vedieť, ako fungujú špeciálne znaky:

  • Znak spätnej lomky \ môže nahradiť iný špeciálny znak v regulárnom výraze:
  • Bodka a w -.

Priraďte všetky znaky okrem nových riadkov. Ak chcete skontrolovať bodku a iba bodku -, písmená, čísla a podčiarkovník - w

  • Hranaté zátvorky .

Zhoduje sa so znakmi v zátvorkách. Podporuje rozsahy. Niektoré príklady:
o - zhoduje sa s ktorýmkoľvek a, b alebo c.
o veľké písmená.
o ľubovoľné číslo.
o - zhoduje sa s akýmikoľvek malými alebo veľkými písmenami abecedy.
Voliteľné? Zhoda 0 alebo 1.
Hviezdička *.

Hviezdička predstavuje 0 alebo viac znakov.

Porovnajte 1 alebo viac znakov.

Kučeravé zátvorky ().

Minimálne a maximálne hodnoty. Niekoľko príkladov syntaxe regulárneho výrazu:
o (1,) aspoň 1.
o (1.3) od 1 do 3.
o (1,64) od 1 do 64.

Pridajme toto všetko, aby sme získali regulárny výraz pre e-mailové adresy:

/[e-mail chránený]+ (. +) * / i


Ako to vyzerá v PHP:

preg_match_all ("/ [e-mail chránený]+ (. +) * / i ", $ vstupné_riadky, $ výstupné_pole);

Použitie regulárneho výrazu na overenie

Výzva: Uistite sa, že vstup je taký, aký očakávame. Cieľ 1: / [^w$. ]/ Cieľ 2: / ^ (1,2) $ /

Regulárne výrazy sú dobré na hľadanie položiek, ale musíte vedieť, čo presne hľadáte.

Kedy by ste na overenie nemali použiť regulárny výraz?

Mnoho prípadov sa lepšie rieši pomocou funkcie filter_var v PHP. Napríklad overenie e-mailu by sa malo vykonávať pomocou vstavaných filtrov PHP:

filter_var (" [e-mail chránený]", FILTER_VALIDATE_EMAIL)

Validácia s regulárnymi výrazmi

Regulárne výrazy na konci riadku používajú kotvy:

^ - označuje začiatok riadku.
$ Je znak dolára, ktorý označuje koniec riadku.

if (! preg_match ("% ^ (1,2) $%", $ _POST ["subscription_frequency"])) ($ isError = true;)

Vylúčené triedy postáv

[^ abc] – všetko okrem a, b alebo c, vrátane nových riadkov.

Príklad, ktorý poskytuje vstup len pre alfanumerické znaky, pomlčky, bodky, podčiarkovníky:

if (preg_match ("/ [^ 0-9a-z -_.] / i", $ productCode)) ($ isError = true;)

Nájsť a nahradiť

Najbežnejšie funkcie PCRE na vyhľadávanie a nahradenie sú preg_replace () a preg_replace_callback (). Existujú však aj preg_filter () a preg_replace_callback_array (), ktoré robia takmer to isté. Všimnite si, že funkcia preg_replace_callback_array () je dostupná od PHP7.

Nahradiť slová v zozname

$ predmet = "Chcem jesť jablká."; echo preg_replace ("/ jablko | banán | pomaranč /", "ovocie", $ predmet);

Výsledok

Chcem jesť nejaké ovocie.

Ak regulárny výraz obsahuje podvzory ( v zátvorkách), môžete nahradiť $ N alebo N (kde N je celé číslo > = 1), nazýva sa to „spätný odkaz“.

Permutácia dvoch čísel

$ predmet = "7/11"; echo preg_replace ("/ (d +) / (d +) /", "$ 2 / $ 1", $ predmet);

Výsledok

Zmeňte formátovanie dátumu

$ predmet = "2001-09-11"; echo preg_replace ("/ (d +) - (d +) - (d +) /", "$ 3 / $ 2 / $ 1", $ predmet);

Výsledok

Jednoduchý príklad nahradenia adresy URL v značke

$ subject = "Ďalšie články nájdete na https://php.earth/doc."; echo preg_replace ("# (https?: // ([^ s. /] + (?:. [^ s. /] +) * [^ s] *)) #i", "$ 2", $ predmet );

Výsledok

int preg_match_all(vzor reťazca, predmet reťazca, pole a zhody [, int flags [, int offset]])

Vyhľadá predmet pre všetky zhody vzoru a umiestni výsledok do zhôd v poradí určenom kombináciou príznakov.

Po nájdení prvej zhody sa ďalšie vyhľadávania nevykonajú od začiatku reťazca, ale od konca posledného nájdeného výskytu.

Voliteľný parameter flags môže kombinovať nasledujúce hodnoty (musíte pochopiť, že pomocou PREG_PATTERN_ORDER zároveň s PREG_SET_ORDER bezvýznamné):

PREG_PATTERN_ORDER

Ak je tento príznak nastavený, výsledok je zoradený nasledovne: $ zhody obsahuje pole úplných zhôd so vzorom, $ zhody obsahuje pole výskytov prvého podvzoru atď.

Vráti počet výskytov nájdeného vzoru (môže byť nula), príp FALSE ak sa počas vykonávania vyskytli nejaké chyby.


Príklad 2. Greedy Matching HTML Tags

// Záznam \\ 2 je príkladom použitia odkazov na podvzory.
// Znamená to, že podreťazec sa musí zhodovať so zachyteným reťazcom
// druhý podvzor, ​​v našom príklade je to ([\ w] +).
// Pri použití dvojitých úvodzoviek sa vyžaduje extra lomka.
$ html = "tučný textklikni na mňa" ; preg_match_all ( "/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/" , $ html, $ sa zhoduje); $ i = 0; $ i< count ($matches [ 0 ]); $i ++) {
echo "zhoda:". $ zodpovedá [0] [$ i]. "\ n";
echo "časť 1:". $ zodpovedá [1] [$ i]. "\ n";
echo "časť 2:". $ zodpovedá [3] [$ i]. "\ n";
echo "časť 3:". $ zodpovedá [4] [$ i]. "\ n \ n";
}
?>

Výsledok príkladu: