Otthon / Internet / Php reguláris kifejezések preg egyezés. Reguláris kifejezések php-ben. Dupla idézőjelek cseréje intelligens idézőjelekre

Php reguláris kifejezések preg egyezés. Reguláris kifejezések php-ben. Dupla idézőjelek cseréje intelligens idézőjelekre


Az egyik nagyon hatékony és hasznos funkció PHP nyelv- reguláris kifejezések támogatása. Sok programozót, kezdőket és gyakorlottakat egyaránt megfélemlít a reguláris kifejezések nyelvének látszólagos összetettsége és bonyolultsága. De biztosíthatlak – megéri. A reguláris kifejezések használata nagyban leegyszerűsíti a szövegek és a gyengén strukturált adatok feldolgozásának munkáját.


A reguláris kifejezések speciális nyelven írt kifejezések.


Ne ijedjen meg, a nyelvet meglehetősen könnyű megérteni, csak tapasztalatra és gyakorlatra van szüksége. Azt hiszem, többször találkozott már olyan helyzetekkel, amikor szövege van (pl Microsoft Word


), és valami fontosat kell találnia benne. Ha tudja, mit keres pontosan, minden egyszerű: hívja elő a keresési párbeszédablakot, írja be a keresett szót, nyomja meg a gombot, és íme, a szöveg megtalálható. De mit fog tenni, ha csak előre tudja, hogy milyen típusú információt keres? Például azzal a feladattal kell szembenéznie, hogy megtalálja az összes címet email

egy párszáz íves dokumentumban. Vannak, akik manuálisan tekintik meg a dokumentumot, mások beírják a kutyát (@) a keresésbe, és megkeresik. Egyetértek – mindkét lehetőség visszavágó, hálátlan munka.

A reguláris kifejezés bizonyos törvények és szabályok szerint összeállított szöveges karakterlánc. A karakterlánc karakterekből és karaktercsoportokból, metakarakterekből, kvantorokból és módosítókból áll.

A szimbólumok alatt ebben az esetben bármely ábécé bármely szimbóluma érthető. És nem csak olvashatókat. Ehhez könnyen beilleszthet egy olvashatatlan karaktert egy kifejezésbe, csak ismernie kell a kódját hexadecimális formában. Például:

// olvasható karakterek a E // olvashatatlan karakterek és kódok \x41 - ugyanaz, mint az "A" betű \x09 - tabulátor karakter

Egy karaktercsoport több, egymás után felírt karakterből áll:

Abvg ACZms

Azonnal szeretném felhívni a figyelmet - a reguláris kifejezésekben a „szóköz” is jelentős karakternek számít, ezért legyen óvatos a kifejezések írásakor. Például ezek a karaktercsoportok KÜLÖNBÖZŐ kifejezések:

ABC HOL ABC HOL

A nyelv következő eleme a metakarakterek. A "meta" előtag azt jelenti, hogy ezek a szimbólumok más szimbólumokat vagy azok csoportjait írják le. A táblázat a reguláris kifejezések nyelvének főbb metakaraktereit írja le:

Metakarakterek speciális karakterek megadásához
() Zárójelek. Beágyazott kifejezéseket határoz meg.
| Kiválasztás metakarakter
^ Sor eleje metakarakter
$ Sorvégi metakarakter
\n Soremelés karakter (hex kód: 0x0A)
\r Kocsivissza karakter (hexadecimális kód 0x0D)
\t Tabulátor karakter (hexadecimális kód 0x09)
\xhh A 0xhh hexadecimális kódú karakter beszúrása, például \x42, a latin "B" betűt szúrja be.
Metakarakterek karaktercsoportok meghatározásához
. Pont. Bármilyen karakter.
\d számjegy (0-9)
\D Nem szám (a 0-9 karakterek kivételével bármilyen karakter)
\s Üres karakter (általában szóköz és tabulátor)
\S Nem üres karakter (minden, kivéve a \s metakarakterrel azonosított karaktereket)
\w Egy "szótár" karakter (olyan karakter, amelyet szavakban használnak. Általában minden betű, minden szám és egy aláhúzás ("_"))
\W Minden, kivéve a \w metakarakter által meghatározott karaktereket

A táblázat második felében található metakarakterek nagyon könnyen megjegyezhetők. "d" - számjegy (számjegy), "s" - szimbólum (szimbólum), "w" - szó (szó). Ha a betű nagy, akkor hozzá kell adni a „NEM”-et a csoport leírásához.

Vegyük például a „Piros mez 1812-es, zöld mezén 2009” szöveget. Nézzünk példákat a legegyszerűbb reguláris kifejezésekre:

\d\d\d\d - megtalálja az 1812-t és a 2009-et \D - megtalálja az összes betűt, szóközt és írásjelet \s - minden szóközt megtalál a szövegben.

De a példánkban szereplő évszám nem négy, hanem két számjeggyel írható, a szavaknak lehetnek más ragozásai stb. A szögletes zárójelben megadott karakterrészhalmazok segíthetnek itt:

Bármely számjegyet jelent (ugyanaz, mint a \d) – páros számjegyet jelent – ​​a latin ábécé bármely szimbólumát (minden esetben) vagy számjegyet jelent.

Például a \d\d\d kifejezés a tesztkarakterláncban csak 1812-t talál, de 2009-et nem. Ezt a kifejezést úgy kell értelmezni, hogy "keresse meg az összes olyan négyjegyű sorozatot, ahol az utolsó számjegy 0,2,4,6 vagy 8"

Már csak a kvantorokat és módosítókat kell megemlítenünk.

A kvantor egy speciális konstrukció, amely meghatározza, hogy egy karakternek vagy karaktercsoportnak hányszor kell megjelennie. A kvantor zárójelben "()" van írva. Két rögzítési formátum lehetséges: precíz és tartomány. A pontos formátum így van leírva:

Itt X az a szám, ahányszor az előző szimbólumot vagy csoportot meg kell ismételni. Például a kifejezés

A második rögzítési forma a tartomány. Rögzítve mint

(X, Y) // vagy (,Y) // vagy (X,)

ahol X a minimum és Y a maximális ismétlések száma. Például:

"kettő-négy számjegy sorban írva" olvasható. Ha az egyik határ nincs megadva, akkor a rendszer nem feltételez korlátozást. Például:

\w(3,) - három vagy több betű. \d(,5) - egyáltalán nincsenek számok, vagy vannak, de legfeljebb öt.

A kvantorok egyetlen karakterre vagy csoportra is alkalmazhatók:

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

Ez a konstrukció kiválasztja a szövegből az összes egy-, két- vagy hárombetűs orosz szót (például „vagy”, „nem”, „én”, „megyek” stb.)

A göndör kapcsos zárójeleken kívül még három kvantor metakarakter található: „*” (csillag), „+” (plusz) és „?” (kérdés). Olyan esetekben használják őket, amikor a szükséges ismétlések minimális és maximális száma előre nem ismert. Például e-mail címek keresésekor nem lehet előre megmondani, hogy hány karakter lesz a felhasználónévben (a "kutya" előtt) és hány a domain névben (a "kutya" után).

A "*" metakarakter a "nullától vagy annál többtől tetszőleges mennyiség", azaz. tervezés

tetszőleges számú egymást követő betűt határoz meg, beleértve azok teljes hiányát is.

A „+” szimbólum csak abban különbözik a csillagtól, hogy legalább egy karakter jelenlétét igényli. Azok. tervezés

bármely egy vagy több számjegyű digitális sorozathoz illeszkedik.

Szimbólum "?" megegyezik egyetlen karakter hiányával vagy jelenlétével. Azok. tervezés

bármely egy vagy két számjegyű digitális sorozathoz illeszkedik.

Itt érdemes megemlíteni a „*” és „+” antiifierek egy olyan tulajdonságát, mint a kapzsiság. A lényeg az, hogy alapértelmezés szerint ezek a karakterek a lehető leghosszabb karaktersorozatnak felelnek meg. Például az „anya kimosta a keretet” sorhoz a következő kifejezés:

a „mama soap ra”-t választja majd, ami némileg váratlan, mert arra számítottunk, hogy „ma”-t kapunk. A viselkedés megváltoztatásához használja a "?" metakaraktert. (kérdőjel) közvetlenül a kvantor után írva. Korlátozza a kvantorok „étvágyát”, mivel arra kényszeríti őket, hogy az első egyezést adják vissza, nem pedig a leghosszabbat. Most változtassuk meg az előző példát:

és megkapja a szükséges „ma” egyezést.

A nyelv utolsó eleme a módosítók. A módosító egy speciális karakter, amely meghatározza a „rendszer” paramétereket a reguláris kifejezések elemzéséhez. Csak négy ilyen szimbólum létezik, ezek külön-külön vagy egyidejűleg is használhatók:

én Engedélyezi a kis- és nagybetűk megkülönböztetésének módját, pl. a nagy- és kisbetűk a kifejezésben nem különböznek egymástól.
m Azt jelzi, hogy a keresett szöveget több sorból állóként kell kezelni. Alapértelmezés szerint a reguláris kifejezés motorja egyetlen karakterláncként kezeli a szöveget, függetlenül attól, hogy valójában mi is az. Ennek megfelelően a "^" és a "$" metakarakterek a teljes szöveg elejét és végét jelzik. Ha ez a módosító meg van adva, akkor minden szövegsor elejét és végét jelzik.
s Az alapértelmezett metakarakter a "." nem tartalmazza az újsor karaktert a definíciójában. Azok. többsoros szöveg esetén a /.+/ kifejezés csak az első sort adja vissza, nem a teljes szöveget, ahogy az elvárható. Ennek a módosítónak a megadása megszünteti ezt a korlátozást.
U Alapértelmezés szerint az összes kvantitatív metakarakter "nem mohó" lesz. A nyelv bizonyos módosításaiban (különösen a PHP-ben) az „U” helyett a „g” karaktert használják, ami jobban megfelel a jelentésnek (a „g” az angol „greedy”, „greedy” rövidítése. ).

A táblázat a legnépszerűbb és legszükségesebb példákat mutatja be a reguláris kifejezésekre. Némelyikük bonyolultnak és nehézkesnek tűnhet az Ön számára, de részletes tanulmányozással kétségtelenül megérti.

Reguláris kifejezések PHP-ben.

A PHP reguláris kifejezéseivel való munkavégzéshez speciális függvények állnak rendelkezésre, amelyek listája rövid leírás táblázatban vannak megadva:

int preg_match (karakterlánc minta, karakterlánc tárgya [, tömbegyezések])

A funkció ellenőrzi, hogy a tárgy tartalma megegyezik-e a mintamintával. Egyezés esetén 1-et ad vissza, ellenkező esetben 0-t. Ha megadja az opcionális matches tömb paramétert, akkor a függvény végrehajtásakor egyetlen elem kerül bele - az első talált egyezés.

int preg_match_all (string minta, karakterlánc tárgya, tömb egyezik [, int sorrend])
A függvény megegyezik az előzővel, azzal az egyetlen különbséggel, hogy a teljes szövegben keres, és a matches tömbben talált ÖSSZES egyezést visszaadja.
vegyes preg_replace (vegyes minta, vegyes helyettesítés, vegyes tárgy [, int limit])
Mindkét elődfüggvényéhez hasonlóan a preg_replace is egy mintának megfelelő szövegrészletet keres. A függvény az összes talált töredéket lecseréli a paraméterekben megadott szövegre.
vegyes preg_replace_callback (vegyes minta, vegyes visszahívás, vegyes tárgy [, int limit])
A funkció az előző bővített változata. A fő különbség az, hogy ez a függvény a paraméterekben átadja annak a függvénynek a nevét, amely elemzi a szöveget és helyettesíti a szöveget.
tömb preg_split (string minta, karakterlánc tárgya [, int limit [, int flags]])
Ez a függvény hasonló az explode() és split() függvényekhez. Különlegessége, hogy az elválasztó nem fix karakterlánc, hanem reguláris kifejezés. A függvény a forrásadatokat elemekre bontja és a kimeneti tömbbe helyezi.
tömb preg_grep (karakterlánc minta, tömbbemenet)
A funkciót a tömbökben történő rendszeres keresésre tervezték. A kereséshez egy sablon és egy bemeneti adatok tömbje van megadva, és egy tömb kerül visszaadásra, amely csak a sablonnak megfelelő elemekből áll.

A figyelembe vett függvények listája még korántsem teljes, de elégséges a reguláris kifejezésekkel való munka sikeres megkezdéséhez. Ha érdekli ez a téma, feltétlenül olvassa el a további irodalmat (például Friedl „Reguláris kifejezések” című könyvét). Ezen kívül edzési célokra javaslom az egyik telepítését speciális programok reguláris kifejezések teszteléséhez (például "PCRE" vagy "RegEx Builder").

Kezdjük azzal, hogy mi is az a reguláris kifejezés. Tehát válaszolj erre a kérdésre: van „e” a „teszt” szóban? "Eszik!" azt mondod. Aztán felteszek egy második kérdést, hogyan találtad meg az "e" betűt a "teszt" szóban? A válasz kézenfekvő, vesszük az első karaktert, vagyis a „t”-t, és összehasonlítjuk azzal, amit keresünk, vagyis az „e”-vel. Ha nem egyenlők, akkor vesszük a második karaktert, vagyis az „e”-t, és összehasonlítjuk azzal, amit keresünk, vagyis az „e”-vel. Voila! Talált egyezést. Válasz: A "teszt" szó az "e" betűt tartalmazza.

Most válaszolj még egy kérdésre, hol van a reguláris kifejezés ebben a példában? Remélem, sejti, hogy itt a reguláris kifejezés az, amit a "teszt" szóban keresünk. Vagyis ebben a példában az "e" betű reguláris kifejezés.

Mire használják a reguláris kifejezéseket a PHP-ben? Gyakorlatomban reguláris kifejezéseket használtak például annak megállapítására, hogy egy e-mail cím helyesen lett-e összeállítva. Az ilyen kifejezések a felhasználónév és jelszó helyességének meghatározására is szolgálnak. Reguláris kifejezések segítségével megtalálhatja a címet egy hivatkozásban, és elmentheti. Ennek elemzésével számos dolgot megtehet, és azonosíthatja a reguláris kifejezések fő funkcióját és két mellékfunkcióját. Fő funkció, ez egy karakterláncban található egyezések keresése. A mellékhatások közé tartozik a talált egyezések mentése és cseréje.

Első reguláris kifejezés

Elméletileg megértjük, hogyan találjuk meg az „e” karaktert a „teszt” szóban, de hogyan valósul meg ez a gyakorlatban? A php reguláris kifejezéseinek használatához általában a következő függvényeket használják:

preg_match("reguláris kifejezés (minta)", "változó, amelyben a keresést végrehajtják", "Változó, amelyben a keresési eredmény mentésre kerül (opcionális paraméter)"); - Matching funkció
preg_replace("reguláris kifejezés (minta)", "Mire cserélje ki a talált egyezést", "változó, amelybe a csere történik"); - Cserélje ki a funkciót

Kezdjük el használni ezeket a függvényeket: Íme egy példa az „e” karakter keresésére a „teszt” szóban:

$a = "teszt";
if(preg_match("/e/",$a)) echo "talált!!";

A kód leírja a feltételt: ha az $a változóban a mintának megfelelőt találunk, akkor jelenítse meg a „found!!” üzenetet. Amint azt bizonyára észrevette, sablonunk két „/” között található. Ebben az esetben a "/" szimbólum a mintánk kezdetét és végét szimbolizálja. Remélem ez egyértelmű.

Mindez persze érdekes... de a sablonunk nagyon egyszerű, nem gondolod? Hiszen ritkán kell valamilyen szimbólumot találnunk egy változóban. A legtöbb esetben sok karaktert kell találnunk, és ismeretleneket is. Hogy lehet ez? Állítsunk fel magunknak egy problémát, és próbáljuk meg megoldani. Tegyük fel, hogy van egy karakterláncunk, amely számokból és egy ismeretlen angol betűből áll

Hogyan lehet megtalálni ezt a levelet? Az angol ábécé bármely betűje lehet, tehát hogyan lehet azonosítani? Te magad válaszoltad a kérdésedre, van bármilyen betű, vagyis a-tól z-ig terjedő tartományban van. Használhat tartományokat a reguláris kifejezésekben. Ha nem tudjuk, hogy milyen karaktert keresünk, de biztosan tudjuk, hogy ez a karakter az angol ábécé betűje, akkor a bejegyzés a következő lesz:

$a = "123a321";
if(preg_match("//",$a)) echo "talált!!";

Vegye figyelembe, hogy a tartomány "[" "]" zárójelben van. Bármi, ami ezekbe a zárójelekbe kerül, egyetlen karakterként van definiálva, ebben az esetben a karakter a-tól z-ig terjed. Ha nem betűt, hanem számot kell keresnünk, akkor a bejegyzés a következő lesz:

$a = "abc1cba";
if(preg_match("//",$a)) echo "talált!!";

Azt is szeretném megjegyezni, hogy a reguláris kifejezések megkülönböztetik a kis- és nagybetűket, így az „A” és „a” karakterek teljesen különbözőek, mindkét karakter kereséséhez írja be a következőt:

$a = "123a321";
if(preg_match("//",$a)) echo "talált!!";

Az orosz betűk keresése is történik, ugyanúgy, mint az angoloknál:

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

Metakarakterek

Megtanultuk, hogyan kell egy karakterláncban ismeretlen karaktert keresni. Mi a teendő, ha több karaktert kell keresnünk? Az úgynevezett metaszimbólumok segítenek... Tegyük fel, hogy van egy karakterláncunk számokkal és betűkkel, hogyan írhatjuk le a sablonban? Ezt megteheti:

vonal - 123a321
minta -

Hmm... a sablon tulajdonképpen egyezik a karakterláncunkkal, és ha ellenőrizzük a megfelelőséget, a régóta várt igazat adja! De ez egy kicsit nehézkes lemez, nem gondolod?

Így rövidítheti le:

vonal - 123a321
minta - *

Nekem úgy tűnik, hogy rövidebb. Mi a „*” szimbólum? Ez ugyanaz a metaszimbólum, ami azt jelenti, hogy az általunk leírt szimbólum (nevezetesen egy olyan szimbólum, amely 0-tól 9-ig tartalmazhat számokat vagy az angol ábécé betűit, a-tól z-ig) korlátlanul, vagy többször is megismételhető. igen igen! Ez a metaszimbólum egy üres változóban talál egyezést, mivel az általunk leírt szimbólum hiánya is igazat ad vissza! Emlékezz erre

Milyen metakarakterek vannak még?

Például a "+" metakarakter Szinte hasonló a "*" metakarakterhez, egy kis kivétellel. A „*” akkor is igazat ad vissza, ha nincs karakter, a „+” pedig legalább egy karakter jelenlétét ellenőrzi. Vagyis ha egy sor legalább egy karaktert igényel, akkor a „*” helyett használja a „+”-t.

A "?" metakarakter is gyakran használatos. Ez azt jelenti, hogy a sor legfeljebb egy kívánt karaktert tartalmazhat. Hadd mondjak néhány példát az általam legutóbb leírt két metakarakterre.

Tegyük fel, hogy ellenőriznünk kell a felhasználó jelszavának helyességét. Gondoljuk át, mit tartalmazzon a felhasználói jelszó? Nos, először is, legalább egy karakternek kell lennie. Másodszor, csak az angol ábécé számait és betűit kell tartalmaznia, így a reguláris kifejezés így fog kinézni:

$a = "qwerty12345";

Milyen karaktereket engedtünk meg? Angol betűk bármilyen kisbetűvel és számmal. Most próbáljon meg egy üres sort hagyni a jelszó helyett.

$a = "";
if(preg_match("/+/",$a)) echo "A jelszó helyes";

Nem fogja látni a „Jelszó helyes” üzenetet. Miért? Mert a "+" metakarakter ellenőrizte a karakterláncot, hogy van-e benne legalább egy karakter.

És most egy kis trükk, nézzük meg az arckifejezésünket, nem engedtük, na, mondjuk szóközt, ugye? tegyen szóközt a jelszó végére, és futtassa

$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "A jelszó helyes";

És miért látjuk a helyes jelszóval kapcsolatos üzenetünket? Nagyon egyszerű... Függvény preg_match(); leállítja az ellenőrzést az első meccsen. Vagyis a „q” szimbólum illeszkedik az általunk leírt mintához, és minden más már nem fontos a funkció szempontjából. Mit tegyünk? A következőképpen javíthatja ki:

$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "A jelszó helyes";

Ha egy "^" karaktert adunk egy kifejezés elejéhez és egy "$"-t a végéhez, akkor azt mondjuk a függvénynek, hogy a teljes karakterláncnak meg kell egyeznie a mintával. Ha ezt a kódot futtatja, nem fogja látni az üzenetet, mivel a jelszó végén egy illegális karakter található - szóköz

Most módosítsa a „+” metakaraktert „?” metakarakterre. Szerinted mi fog történni? Helyesen, nem lesz üzenet a jelszó helyességéről, mivel a jelszó egynél több karaktert tartalmaz. Remélem, megfelelően elmagyaráztam ennek a három gyakran használt metakarakternek a működését

Néha jobb a "nem".

Legalább megtanultuk ellenőrizni a jelszó helyességét, és ez jó! Hadd meséljek el egy másik módszert, amellyel egy karakterláncban kereshetsz valamit. Tegyük fel, hogy ellenőriznünk kell a számok hiányát egy karakterláncban. Hogyan kell ezt csinálni? Íme a sor:

(Ezeket a "-_+()" szimbólumokat kifejezetten azért vezettem be, hogy az élet ne tűnjön méznek...) Megfogalmazhatjuk a következő kifejezést:

De el kell ismerni, hogy nem mindig tudjuk, hogy milyen karaktereket használunk egy sorban, de azt biztosan tudjuk, hogy számok nem lehetnek benne! Ezért logikusabb lenne egyszerűen olyan sablont írni, amelyik átugorja a számokat nem tartalmazó sorokat, és nem azokat, amelyekben az „Úristen, mennyi érthetetlen karakter!!!” . Íme egy példa az ilyen problémák helyesen összeállított kifejezésére:

$a = "a-_+()";
if(preg_match("/^[^0-9]+$/",$a)) echo "Nincs szám!";

Hogyan értük el ezt? Beírtuk a szimbólumot, de!

No de lassan zárjuk le... Mondok két példát magyarázattal, amelyek során megtanuljuk, hogyan lehet a keresési eredményt változóba menteni, és megtanuljuk a postacím helyességének ellenőrzését

Láttam és elmentettem!

A blogom

$a = " A blogom";
preg_match("/ /", $a);

Reguláris kifejezésünkben leírtuk az összes lehetséges karaktert, amely egy hivatkozásban szerepelhet. Szeretnék figyelni az idézőjelekre és a „/” karakterekre is a kifejezésünkben. A helyzet az, hogy a „/” és az idézet önmagukban is különleges karakterek. És ahhoz, hogy a sablon közönséges szimbólumokként érzékelje őket, le kell szűrnünk őket. A képernyő adaptációja a speciális karakterek elé fordított perjel hozzáadásával történik. Remélem világos

$a = " A blogom";
preg_match("/ /", $a, $b);

Nos, ennek megfelelően hozzá kell adni egy további paramétert a $b változó formájában, amelyben a talált hivatkozás tárolásra kerül. Azt is tudnia kell, hogy a keresési eredmény egy tömbbe kerül. Ezért a $b változó egy tömb. A keresett információ az 1. index alatt található. Ez azt jelenti, hogy a keresés eredménye a $b változóban található. Az eredményt jelenítsük meg a képernyőn:

$a = " A blogom";
preg_match("/ /", $a, $b);
visszhang $b;

A helyes cím a siker kulcsa!

És végül a válasz arra a kérdésre, hogy helyes-e az e-mail? Először is meg kell találnia, hogy milyen karakterek megengedettek a címekben? Amennyire én tudom, az engedélyezett karakterek közé tartoznak:

  • Angol betűk, számok, „_”, „-” ummmm úgy tűnik, minden... Ebből indulunk ki.
  • Következő a "@"
  • Utána angol betűk
  • Következő, pont
  • És megint angol betűk...

Tehát a reguláris kifejezés a következő lesz:

$a = " [e-mail védett]";
if(preg_match("/^+@+.+$/", $a)) echo "az e-mail cím helyes!";
else echo "NEM helyesen van beírva az e-mail cím!";

Hát... Remélem, hogy az ilyen lemezek most nem ijesztenek meg, és teljesen megérti őket.

Végül szeretnék valamit mondani. A cikk nehézkesnek bizonyult, ugyanakkor a lehetőségeknek csak egy részére terjedt ki. Ha ezt a mondatot olvasod, akkor valószínűleg a végéig elolvastad, amit nagyon köszönünk

Ami pedig a cms blog fejlesztéséről szóló cikksorozatot illeti, a sorozat első részét lezártnak nyilvánítom!

A reguláris kifejezések lehetővé teszik, hogy egy karakterláncban olyan sorozatokat találjon, amelyek megfelelnek egy mintának. Például a „Vasya(.*)Pupkin” sablon lehetővé teszi egy szekvencia megtalálását, ha tetszőleges számú karakter van a Vasya és Pupkin szavak között. Ha hat számjegyet kell találnunk, akkor „(6)”-ot írunk (ha például hattól nyolc számjegyig, akkor „(6,8)”). Ez elválasztja az olyan dolgokat, mint a karakterkészlet-jelző és a szükséges számjelző:

Karakterkészlet helyett bármely karakter megjelölése használható - egy adott karakterkészlet megadható (a sorozatok támogatottak - az említett "0-9"); Jelölheti: „kivéve ezt a készletet

karakterek". A karakterek számát a hivatalos PHP dokumentációban "kvantifikátornak" nevezik. A kifejezés kényelmes és nem jár félreértésekkel. Tehát egy kvantornak lehet egy meghatározott értéke – vagy egy rögzített érték („(6)”), vagy egy numerikus intervallum („(6,8)”), vagy egy absztrakt „bármilyen szám, beleértve a 0-t” („( " *"), "bármilyen természetes szám

" - 1-től a végtelenig ("+": "dokumentum+.txt"), "0 vagy 1" ("?"). Ennek a karakterkészletnek az alapértelmezett kvantorja egy ("dokumentum.txt").

A kombinációk rugalmasabb kereséséhez ezek a „karakterkészlet - kvantor” hivatkozások metastruktúrákká kombinálhatók.

Mint minden rugalmas eszköz, a reguláris kifejezések is rugalmasak, de nem feltétlenül: alkalmazási területük korlátozott. Például, ha a szövegben egy rögzített karakterláncot le kell cserélnie egy másik, ismét rögzített karakterláncra, használja az str_replace parancsot. A PHP fejlesztők sírva könyörögnek, hogy ne használjunk erre a célra bonyolult ereg_replace vagy preg_replace függvényeket, mert ezek meghívásakor a karakterlánc-értelmezés folyamata következik be, és ez komolyan felemészti a rendszer erőforrásait. Sajnos ez a kezdő PHP programozók kedvenc rakeje. Csak akkor használjon reguláris kifejezés függvényeket, ha nem tudja, hogy pontosan milyen karakterlánc található. Példák: keresési kód, amelyben a keresési karakterláncból kivágják a szolgáltatáskaraktereket és a rövid szavakat, valamint kivágják a felesleges szóközöket (vagy inkább az összes szóközt tömörítik: a „+” helyett egy szóköz van). Ezekkel a funkciókkal ellenőrzöm a véleményét elhagyó felhasználó e-mailjét. Sokat lehet tenni, de fontos észben tartani, hogy a reguláris kifejezések nem mindenhatóak. Például egy komplex helyettesítés Jobb, ha nem teszed meg őket. Hiszen például a „(.*)” kombináció a programban azt jelenti, hogy a szöveg összes karakterében végig kell keresni. Ha pedig a sablon nincs a sor elejéhez vagy végéhez kötve, akkor magát a sablont „mozgatja” a program a teljes szövegen, és az eredmény dupla keresés, vagy inkább keresés négyzetes. Nem nehéz kitalálni, hogy egy másik „(.*)” kombináció egy kocka feletti iterációt jelent, és így tovább. Emelje fel mondjuk 5 kilobájt szöveget a harmadik hatványra. 125 000 000 000 (szóval: százhuszonöt milliárd művelet) derül ki. Persze ha szigorúan közelítünk, akkor nem lesz annyi művelet, hanem négyszer-nyolcszor kevesebb, de maga a számsorrend fontos.

Karakterkészlet
. pontbármilyen karakter
[] szögletes zárójelekkarakterosztály ("bármelyik"). Például
[^] negatív karakterosztály ("bármilyen, kivéve")
- gondolatjelsorozat megjelölése egy karakterosztályban ("" számjegy)
\d Csak számok
\D[^0-9] A számokon kívül
\w Betűk és számok
\W[^a-z0-9]A betűk és számok mellett
\s Szóköz karakterek: szóköz, tabulátor, újsor
\S[^ ] Kivéve a szóköz karaktereket
| (egy|másik)Ezen a helyen lehet a felsorolt ​​lehetőségek egyike, például: (Vasya|Petya|Masha). Ha nem szeretné, hogy bekerüljön a választékba, használja a (?: ...)

Ne használjon karakterosztályt csak egy jelölésére (a „+” helyett a „+” is jó lesz). Ne írjon pontot a karakterosztályba, ez bármilyen karakter, akkor az osztály többi karaktere egyszerűen felesleges lesz (és be negatív osztály ez az összes karakter tagadását eredményezi).

Kvantifikátor

A kvantor egy konkrét értéket és határértéket is jelezhet. Ha a megadott szám a kvantor határain belül esik, akkor a kifejezés töredéke megegyezik az elemezni kívánt karakterlánccal. Szintaxis:

{ }

{ , }

Ha csak a szükséges minimumot kell megadnia, de maximum nincs, egyszerűen tegyen vesszőt, és ne írja be a második számot: „(5,)” („minimum 5”). Különleges jelölések vannak a leggyakrabban használt kvantorokra:

A gyakorlatban az ilyen szimbólumokat gyakrabban használják, mint a göndör zárójeleket.

Horgonyok

Ezeknek a karaktereknek a sor legelején és legvégén kell megjelenniük.

Mohóság A kérdőjel kvantifikátor minimalizálóként is működik:
.*?

A példa eredménye: Mohó változat: félkövér szöveg [b]és itt - még félkövérebben tért vissza Lazy verzió: félkövér szöveg [b]és itt - még félkövérebben tért vissza

A sablonsor, amint azt már észrevette, perjelekkel kezdődik és végződik. A második után következnek a paraméterek:

énkis- és nagybetűket nem érzékeny keresés
m

többsoros mód. Alapértelmezés szerint a PCRE csak egy sorban keres mintaegyezéseket, és a "^" és "$" karakterek csak a teljes szöveg elejére és végére egyeznek.

sHa ez a beállítás be van állítva, a „^” és a „$” egyezik az egyes sorok elején és végén.
szimbólum "." (pont) is megfelel a sortörésnek (alapértelmezett nem)A
rögzítse a szöveg elejéhezE
Uarra kényszeríti a "$" karaktert, hogy csak a szöveg végére illeszkedjen.
Figyelmen kívül hagyva, ha az m paraméter be van állítva.Minden kvantornál megfordítja a „mohó” értéket (ha egy kvantort „?” követ, akkor az a kvantor már nem „mohó”).
e
  • A helyettesítő karakterlánc PHP kódként értelmeződik.
  • A reguláris kifejezésekkel való munkavégzés függvényei preg_grep preg_match – Egyezés-ellenőrzést végez
  • reguláris kifejezés
  • . Ez a funkció csak az első egyezést keresi! preg_match_all preg_quote – A reguláris kifejezésekben szereplő karaktereket kihagyja.
  • Azok. perjeleket szúr be az összes szolgáltatási karakter elé (például zárójelek,
  • szögletes zárójelek
  • stb.) szó szerint értendő. Ha van felhasználói bevitele, és azt reguláris kifejezésekkel ellenőrzi, akkor jobb, ha kihagyja a szolgáltatás karaktereit a bejövő változóban, mielőtt ezt megtenné.
preg_replace

preg_replace_callback – Reguláris kifejezések keresését és cseréjét hajtja végre

preg_split

preg_grep

preg_grep függvény – Egy mintának megfelelő előfordulások tömbjét adja vissza

Szintaxis

tömb preg_grep (karakterlánc minta, tömbbemenet [, int zászlók])
A preg_grep() egy tömböt ad vissza, amely a bemeneti tömb adott mintának megfelelő elemeiből áll. A flags paraméter a következő értékeket veheti fel: PREG_GREP_INVERT
Ha ez a jelző be van állítva, a preg_grep() függvény ezeket adja vissza
tömbelemek

, amelyek nem egyeznek az adott mintamintával.

A preg_grep() által visszaadott eredmény ugyanazokat az indexeket használja, mint az eredeti adattömb. Ha ez a viselkedés nem felel meg Önnek, használja az array_values() függvényt a preg_grep() által visszaadott tömbön az újraindexeléshez.

Minta kód:

preg_split

// Visszaadja az összes lebegőpontos számokat tartalmazó tömbelemet // $fl_array = preg_grep("/^(\d+)?\.\d+$/", $tömb);

preg_match preg_match függvény – Egyezést hajt végre egy reguláris kifejezéssel egyezés van megadva, akkor az meg lesz töltve keresési eredményekkel. A $matches elem tartalmazza a karakterláncnak azt a részét, amely megfelel a teljes mintának, a $matches a karakterláncnak az első almintának megfelelő részét, és így tovább.

A zászlók a következő értékeket vehetik fel:

PREG_OFFSET_CAPTURE

A keresés balról jobbra történik, a sor elejétől. Az opcionális offset paraméterrel a keresés alternatív kezdőpozíciója adható meg. Hasonló eredményt érhetünk el, ha a tárgyat substr())-ra cseréljük ($tárgy, $eltolás).

A preg_match() függvény a talált egyezések számát adja vissza. Ez lehet 0 (nincs találat) vagy 1, mivel a preg_match() az első találat után leáll. Ha meg kell találnia vagy meg kell számolnia az összes egyezést, használja a preg_match_all() függvényt. A preg_match() függvény FALSE értéket ad vissza, ha a végrehajtás során hiba történik.

Javaslat: Ne használja a preg_match() függvényt, ha ellenőriznie kell, hogy egy adott karakterláncban van-e részkarakterlánc. Ehhez használja az strpos() vagy strstr() függvényt, mivel ezek sokkal gyorsabban hajtják végre a feladatot.

Példakód Példakód Példakód Példa eredménye:

domain név: site

preg_match_all

preg_match_all függvény – Globális mintakeresést hajt végre egy karakterláncban

preg_split

int preg_match_all (sztring minta, karakterlánc tárgya, tömbegyezések [, int flags [, int offset]])

Megkeresi a karakterlánc tárgyában a mintaminták összes egyezését, és az eredményt a jelzők kombinációja által meghatározott sorrendben a matches tömbbe helyezi.

Az első egyezés megtalálása után a további keresések nem a karakterlánc elejétől, hanem az utolsó talált előfordulás végétől indulnak.

Az opcionális flags paraméter a következő értékeket kombinálhatja (ne feledje, hogy a PREG_PATTERN_ORDER és a PREG_SET_ORDER egyidejű használata értelmetlen):

PREG_PATTERN_ORDER
Ha ez a jelző be van állítva, az eredmény a következőképpen lesz rendezve: a $matches elem a minta teljes előfordulásának tömbjét tartalmazza, a $matches elem az első alminta előfordulási tömbjét, és így tovább.

Példakód A példa eredménye: példa: , ez egy tesztpélda: , ez egy teszt

Amint látjuk, a $out a minta teljes előfordulásának tömbjét tartalmazza, a $out elem pedig a címkékben található részkarakterláncok tömbjét tartalmazza.

PREG_SET_ORDER
Ha ez a jelző be van állítva, az eredmény a következőképpen lesz rendezve: a $matches elem tartalmazza az első előfordulási készletet, a $matches elem a második előfordulási készletet, és így tovább.

Példakód A példa eredménye: példa: , példa: ez egy teszt, ez egy teszt

Ebben az esetben a $matches tömb tartalmazza az egyezések első halmazát, nevezetesen: a $matches elem tartalmazza a teljes minta első előfordulását, a $matches elem az első alminta első előfordulását stb. Hasonlóképpen, a $matches tömb tartalmazza az egyezések második halmazát, és így tovább minden talált egyezésnél.

PREG_OFFSET_CAPTURE
Ha ez a jelző meg van adva, akkor minden egyes talált részkarakterlánchoz megjelenik a helye a forráskarakterláncban. Fontos megjegyezni, hogy ez a jelző megváltoztatja a visszaadott adatok formátumát: minden előfordulás tömbként kerül visszaadásra, amelynek nulladik eleme tartalmazza a talált részstringet, az első elem pedig az eltolást.

Ha nem használ jelzőt, az alapértelmezett a PREG_PATTERN_ORDER.

A keresés balról jobbra történik, a sor elejétől. Az opcionális offset paraméterrel a keresés alternatív kezdőpozíciója adható meg. Hasonló eredményt érhetünk el, ha a tárgyat substr())-ra cseréljük ($tárgy, $eltolás).

Visszaadja a talált minta előfordulások számát (lehet nulla) vagy FALSE-t, ha hiba történt a végrehajtás során.

Példakód Példakód Példa eredménye: egyezett: félkövér szöveg 1. rész: 2. rész: félkövér szöveg 3. rész: Egyező: kattints rám 1. rész: 2. rész: kattints rám 3. rész: preg_quote

preg_quote függvény – A reguláris kifejezésekben szereplő karaktereket kihagyja

preg_split

string preg_quote (string str [, karakterlánc határoló])

A preg_quote() függvény veszi az str karakterláncot, és minden speciális karakter elé egy fordított perjelet ad. Ez akkor lehet hasznos, ha a sablon karakterlánc-változókat tartalmaz, amelyek értéke a szkript működése során változhat.

Ha meg van adva a további határoló paraméter, akkor az is kikerül. Ez hasznos a PCRE funkciókban használt limiter megszökéséhez. A leggyakoribb határoló a "/" karakter.

A reguláris kifejezésekben a következő karakterek minősülnek szolgáltatási karaktereknek: . \\ + * ? [ ^ ] $ () ( ) = !< > | :

Példakód Példakód A példa eredménye: Ez a könyv az *nagyon* nehéz megtalálni. preg_replace

preg_replace függvény – Keresést és cserét hajt végre reguláris kifejezés használatával

preg_split

vegyes preg_replace (vegyes minta, vegyes helyettesítés, vegyes tárgy [, int limit])

Megkeresi a karakterlánc tárgyában a minta egyezéseit, és lecseréli őket cserére. Ha meg van adva a limit paraméter, akkor a sablon limitelőfordulásai lecserélődnek; ha a limitet kihagyjuk, vagy egyenlő -1-gyel, a minta minden előfordulása lecserélődik.

A csere tartalmazhat \\n vagy (PHP 4.0.4 óta) $n formátumú hivatkozásokat, az utóbbi előnyösebb. Minden ilyen hivatkozás lecserélődik a zárójelben lévő n-edik almintának megfelelő részkarakterláncra balról jobbra számozott, eggyel kezdve.

Ha helyettesítő karakteres helyettesítést használ részminta hivatkozásokkal, akkor előfordulhat, hogy a maszkot közvetlenül egy szám követi. Ebben az esetben a \\n-hez hasonló jelölések hibát eredményeznek: az első almintára való hivatkozás, amelyet az 1-es szám követ, \\11-ként íródik, ami a tizenegyedik almintára való hivatkozásként lesz értelmezve. Ez a félreértés kiküszöbölhető a \$(1)1 konstrukció használatával, amely az első részmintára való elszigetelt hivatkozást jelöli, amelyet az 1 számjegy követ.

Példa kód

A példa kimenete a következő lesz:

Ha a függvény végrehajtása során mintaegyezést találunk, akkor a módosított tárgyérték kerül visszaadásra, ellenkező esetben az eredeti tárgy kerül visszaadásra.

A preg_replace() első három paramétere egydimenziós tömb lehet. Abban az esetben, ha a tömb kulcsokat használ, a tömb feldolgozása során azokat abban a sorrendben veszik, amelyben a tömbben helyezkednek el. A kulcsok megadása a tömbben a mintához és a cseréhez nem kötelező. Ha úgy dönt, hogy indexeket használ a csere során használt minták és karakterláncok egyeztetésére, használja a ksort() függvényt minden tömbön.

A medve fekete lassan átugrott a lusta kutyán.

A ksort() segítségével a kívánt eredményt kapjuk:

A lassú fekete medve átugrott a lusta kutyán.

Ha a tárgyparaméter egy tömb, akkor annak minden elemére mintakeresés és csere történik. A visszaadott eredmény is egy tömb lesz.

Ha a minta és a csereparaméterek tömbök, a preg_replace() felváltva lekér egy elempárt mindkét tömbből, és ezeket használja a keresési és csereművelethez. Ha a helyettesítő tömb több elemet tartalmaz, mint mintát, akkor a hiányzó elemek pótlására üres karakterláncok kerülnek felhasználásra. Ha a minta egy tömb, a helyettesítés pedig egy karakterlánc, akkor a mintatömb minden eleme megkeresésre kerül, és mintával helyettesíthető (a tömb minden eleme a minta lesz, míg a helyettesítő karakterlánc rögzített marad). Nincs értelme annak az opciónak, amikor a minta egy karakterlánc, a helyettesítés pedig egy tömb.

Az /e módosító megváltoztatja a preg_replace() függvény viselkedését oly módon, hogy a helyettesítési paraméter a szükséges helyettesítések végrehajtása után PHP kódként értelmeződik, és csak ezután kerül felhasználásra a cserére. A módosító használatakor legyen óvatos: a helyettesítő paraméternek érvényes PHP kódot kell tartalmaznia, különben szintaktikai hiba lép fel a preg_replace() függvényhívást tartalmazó sorban.

Mintakód: Cserélje ki több mintával

Ez a példa a következőt fogja kiadni:

$startDate = "1999.05.27.";

Példakód: Az /e módosító használata Példakód: Az összes HTML-címkét nagybetűssé alakítja preg_replace_callback

preg_replace_callback függvény – reguláris kifejezések keresését és cseréjét hajtja végre egy visszahívási függvény segítségével

preg_split

vegyes preg_replace_callback (vegyes minta, visszahívás, vegyes tárgy [, int limit])

Ennek a függvénynek a viselkedése sok tekintetben hasonlít a preg_replace(hez), azzal a különbséggel, hogy a helyettesítési paraméter helyett egy visszahívási függvényt kell megadni, amely a talált előfordulások tömbjét adja át bemeneti paraméterként. A várt eredmény a cserélendő karakterlánc.

Példakód (.*?).")", $xml, $egyezik, PREG_PATTERN_ORDER);

return $matches; )

Keressen XHTML/XML címkéket adott attribútumértékkel

Ez a függvény nagyon hasonlít az előzőhöz, azzal a különbséggel, hogy megadhatja a címkének a kívánt attribútumot. Például könnyen megtalálhatja.

Függvény get_tag($attr, $value, $xml, $tag=null) ( if(is_null($tag)) $tag = "\w+"; else $tag = preg_quote($tag); $attr = preg_quote($ attr = preg_quote($tag_regex = "/]*$attr\s*=\s*"(["\"])$érték\\2[^>]*>(). .*?)/" preg_match_all($tag_regex, $xml, $matches, PREG_PATTERN_ORDER); return $matches; )

Egy újabb hasznos eszköz webfejlesztők számára! Lehetővé teszi a hexadecimális színértékek megtalálását/ellenőrzését.

$string = "#555555"; if (preg_match("/^#(?:(?:(3))(1,2))$/i", $string)) ( echo "6. példa sikeres."; )

Keresés a cikk címében

Ez a kódrészlet megkeresi és megjeleníti a HTML-oldalon található címkéken belüli szöveget.

$fp = fopen("http://www.catswhocode.com/blog","r"); while (!feof($fp))( $oldal .= fgets($fp, 4096); ) $titre = eregi("(.*)",$oldal,$regs); echo $regs; fclose($fp);

Apache naplók elemzése

A legtöbb webhely a jól ismert Apache webszerveren fut. Ha az Ön webhelye is ezek közé tartozik, miért ne használna PHP-t és reguláris kifejezéseket az Apache-naplók elemzéséhez?

//Naplók: Apache webszerver //Csak a HTML-fájlok sikeres találatai. Hasznos az oldalmegtekintések számának számításához. "^((?#kliens IP vagy domain neve)S+)s+((?#alap hitelesítés)S+s+S+)s+[((?#dátum és idő)[^]]+)]s+"(?: GET|POST|HEAD) ((?#fájl)/[^ ?]+?.html?)??((?#paraméterek)[^ ?]+)? HTTP/+"s+(?#állapotkód)200s+((?#byte transfer)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#felhasználói ügynök )[^"]*)"$" //Napló: Apache webszerver //Csak 404-es hiba "^((?#kliens IP vagy tartománynév)S+)s+((?#alap hitelesítés)S+s+S+) s+[((?#dátum és idő)[^]]+)]s+"(?:GET|POST|HEAD) ((?#fájl)[^ ?"]+)??((?#paraméterek)[ ^ ?"]+)? HTTP/+"s+(?#állapotkód)404s+((?#byte transfer)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#felhasználói ügynök )[^"]*)"$"

Dupla idézőjelek cseréje intelligens idézőjelekre

Ha rajong a tipográfiaért, tetszeni fog ez a reguláris kifejezés, amely a hagyományos dupla idézőjeleket intelligens idézőjelekre cseréli. Hasonló reguláris kifejezést használ a WordPress az oldal tartalmában.

Preg_replace("B"b([^"x84x93x94rn]+)b"B", "?1?", $szöveg);

Átfogó jelszóellenőrzés

Ez a reguláris kifejezés biztosítja, hogy legalább hat karakter, szám, kötőjel és aláhúzásjel kerüljön a szövegmezőbe.

A szövegmezőnek legalább egy nagybetűt, egy kisbetűt és egy számot kell tartalmaznia.

"A(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?)(?=[-_a-zA-Z0-9]*?) [-_a-zA-Z0-9](6,)z"

WordPress: Reguláris kifejezés használata képek felvételéhez egy bejegyzésből

Mivel Önök közül sokan WordPress-felhasználók, szükség lehet egy olyan kódra, amely lehetővé teszi a cikk szövegéből származó összes kép lekérését és megjelenítését.

A kód használatához egyszerűen illessze be a téma bármelyik fájljába.