Sākums / Windows pārskats / Php regulāra no virknes numura. PHP regexp: regulāro izteiksmju piemēri. Regulāro izteiksmju piemēri

Php regulāra no virknes numura. PHP regexp: regulāro izteiksmju piemēri. Regulāro izteiksmju piemēri

Sāksim ar to, kas ir regulārā izteiksme. Tāpēc atbildiet man uz šo jautājumu: vai vārdā "tests" ir burts "e"? "Ēd!" tu saki. Tad es jums uzdodu otru jautājumu, kā jūs atradāt burtu "e" vārdā "tests"? Atbilde ir acīmredzama, mēs ņemam pirmo rakstzīmi, tas ir, “t” un salīdzinām ar to, ko meklējam, tas ir, ar “e”. Ja tie nav vienādi, mēs ņemam otro rakstzīmi, tas ir, “e”, un salīdzinām ar to, ko meklējam, tas ir, “e”. Voila! Tika atrasta atbilstība. Atbilde: Vārds "tests" satur burtu "e".

Tagad atbildiet man vēl uz vienu jautājumu, kur ir regulārā izteiksme šajā piemērā? Es ceru, ka jūs uzminējāt, ka regulārā izteiksme šeit ir tas, ko mēs meklējam vārdā "tests". Tas nozīmē, ka burts "e" šajā piemērā ir regulāra izteiksme.

Kam PHP tiek izmantotas regulārās izteiksmes? Manā praksē regulāras izteiksmes tika izmantotas, piemēram, lai noteiktu, vai adrese ir sastādīta pareizi e-pasts. Šādas izteiksmes izmanto arī lietotājvārda un paroles pareizības noteikšanai. Izmantojot regulārās izteiksmes, jūs varat atrast adresi saitē un saglabāt to. Ir daudzas lietas, ko varat darīt, analizējot to, jūs varat noteikt regulāro izteiksmju galveno funkciju un divas blakus funkcijas. Galvenā funkcija , šī ir atbilstības meklēšana virknē. Blakusparādības ietver atrasto sērkociņu saglabāšanu un aizstāšanu.

Pirmā regulārā izteiksme

Teorētiski mēs saprotam, kā atrast rakstzīmi “e” vārdā “tests”, bet kā tas tiek īstenots praksē? Lai php izmantotu regulāras izteiksmes, parasti tiek izmantotas šādas funkcijas:

preg_match("regulārā izteiksme (raksts)", "mainīgais, kurā tiek veikta meklēšana", "Mainīgais, kurā tiek saglabāts meklēšanas rezultāts (neobligāts parametrs)"); - Saskaņošanas funkcija
preg_replace("regulārā izteiksme (raksts)", "Ar ko aizstāt atrasto atbilstību", "mainīgais, kurā tiek veikta aizstāšana"); - Nomaiņas funkcija

Sāksim izmantot šīs funkcijas. Šeit ir piemērs rakstzīmes "e" meklēšanai vārdā "tests".

$a = "pārbaude";
if(preg_match("/e/",$a)) echo "atrasts!!";

Kods apraksta nosacījumu: ja mainīgajā $a tiek atrasts kaut kas atbilstošs paraugam, parādiet ziņojumu “found!!” Kā jūs, iespējams, pamanījāt, mūsu veidne atrodas starp diviem "/". IN šajā gadījumā simbols "/" simbolizē mūsu modeļa sākumu un beigas. Es ceru, ka tas ir skaidrs.

Tas viss, protams, ir interesanti... bet mūsu veidne ir ļoti vienkārša, vai ne? Galu galā mums reti ir jāatrod kāds simbols mainīgajā. Vairumā gadījumu mums ir jāatrod daudzas rakstzīmes un arī nezināmas. Kā tas var būt? Izvirzīsim sev problēmu un mēģināsim to atrisināt. Pieņemsim, ka mums ir virkne, kas sastāv no cipariem un viena nezināma angļu burta

Kā atrast šo vēstuli? Var būt jebkurš angļu alfabēta burts, kā jūs varat to identificēt? Jūs pats atbildējāt uz savu jautājumu, ir jebkurš burts, tas ir, tas ir diapazonā no a līdz z. Regulārajās izteiksmēs varat izmantot diapazonus. Ja nezinām, kādu rakstzīmi meklējam, bet noteikti zinām, ka šī rakstzīme ir angļu alfabēta burts, tad ieraksts būs šāds:

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

Ņemiet vērā, ka diapazons ir ietverts iekavās "[" "]". Viss, kas ietverts šādās iekavās, ir definēts kā viens simbols, šajā gadījumā simbols ir no a līdz z. Ja mums jāatrod nevis burts, bet cipars, tad ieraksts būs šāds:

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

Vēlos arī atzīmēt, ka regulārās izteiksmes ir reģistrjutīgas, tāpēc rakstzīmes “A” un “a” ir pilnīgi atšķirīgas. Lai meklētu abas rakstzīmes, rakstiet šādi:

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

Ir arī krievu burtu meklēšana, kas tiek veikta tāpat kā angļu valodā:

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

Metaraksti

Mēs iemācījāmies virknē meklēt nezināmu rakstzīmi. Ko darīt, ja jāatrod vairākas rakstzīmes? Palīgā nāk tā saucamie metasimboli... Pieņemsim, ka mums ir virkne ar cipariem un burtiem, kā to var aprakstīt veidnē? To var izdarīt:

līnija - 123a321
paraugs -

Hmm... veidne faktiski atbilst mūsu virknei, un, pārbaudot atbilstību, tā sniegs ilgi gaidīto patiesību! Bet tas ir sava veida apgrūtinošs ieraksts, vai ne?

Lūk, kā to saīsināt:

līnija - 123a321
paraugs - *

Man šķiet, ka tas ir īsāks. Kas ir “*” simbols? Šis ir tas pats metasimbols, tas nozīmē, ka mūsu aprakstītais simbols (proti, simbols, kas var saturēt ciparus no 0 līdz 9 vai angļu alfabēta burtus no a līdz z) var tikt atkārtots bezgalīgi vai vairāk nekā vienu reizi. jā jā! Šis metasimbols atradīs atbilstību tukšā mainīgā, jo pat tad, ja nav aprakstītā simbola, tiks atgriezta patiesība! Atcerieties šo

Kādi citi metaraksti ir tur?

Piemēram, metaraksts "+" Tas ir gandrīz līdzīgs metarakstzīmei "*" ar vienu nelielu izņēmumu. “*” atgriezīs patiesu, pat ja nav rakstzīmes, un “+” pārbaudīs, vai ir vismaz viena rakstzīme. Tas ir, ja līnijai ir nepieciešama klātbūtne minimums vienu rakstzīmi, pēc tam izmantojiet "+", nevis "*"

Bieži tiek izmantots arī metaraksts "?". Tas nozīmē, ka rindā nedrīkst būt vairāk par vienu vēlamo rakstzīmi. Ļaujiet man sniegt dažus piemērus pēdējām divām manis aprakstītajām metarakstzīmēm.

Pieņemsim, ka mums ir jāpārbauda lietotāja paroles pareizība. Padomāsim par to, kam vajadzētu būt lietotāja parolei? Pirmkārt, tai ir jābūt vismaz vienai rakstzīmei. Otrkārt, tajā jāsatur tikai angļu alfabēta cipari un burti, tāpēc regulārā izteiksme izskatīsies šādi:

$a = "qwerty12345";

Kādas rakstzīmes mēs atļāvām? Angļu burti jebkurā gadījumā un cipari. Tagad mēģiniet paroles vietā atstāt tukšu rindiņu.

$a = "";
if(preg_match("/+/",$a)) echo "Parole ir pareiza";

Jūs neredzēsit ziņojumu “Parole ir pareiza”. Kāpēc? Jo "+" metaraksts pārbaudīja virkni, lai redzētu, vai tajā ir vismaz viena rakstzīme.

Un tagad neliels triks, paskatīsimies uz mūsu izteiksmi, mēs neļāvām, nu, teiksim, atstarpi tajā, vai ne? ielieciet atstarpi paroles beigās un palaidiet

$a = "qwerty12345";
if(preg_match("/+/",$a)) echo "Parole ir pareiza";

Un kāpēc mēs redzam ziņojumu par pareizo paroli? Tas ir pavisam vienkārši... Funkcija preg_match(); pārtrauc tā pārbaudi pirmajā mačā. Tas nozīmē, ka simbols “q” atbilst mūsu aprakstītajam modelim, un viss pārējais vairs nav svarīgs funkcijai. Kas mums jādara? Lai to labotu, veiciet tālāk norādītās darbības.

$a = "qwerty12345";
if(preg_match("/^+$/",$a)) echo "Parole ir pareiza";

Pievienojot "^" izteiksmes sākumā un "$" beigās, mēs pasakām funkcijai, kam ir jāatbilst paraugam. visi līniju. Ja palaižat šo kodu, jūs neredzēsit ziņojumu, jo paroles beigās ir nelegāla rakstzīme - atstarpe

Tagad mainiet metarakstūru "+" uz metarakstūru "?". Kā jūs domājat, kas notiks? Pareizi, netiks parādīts ziņojums par paroles pareizību, jo parole satur vairāk nekā vienu rakstzīmi. Es ceru, ka es pareizi izskaidroju šo trīs bieži lietoto metaraksturu darbību

Dažreiz "nē" ir labāks

Mēs vismaz esam iemācījušies pārbaudīt, vai parole ir pareiza, un tas ir labi! Ļaujiet man pastāstīt par citu veidu, kā meklēt kaut ko virknē. Pieņemsim, ka mums ir jāpārbauda, ​​vai virknē nav skaitļu. Kā to izdarīt? Lūk, līnija:

(Es īpaši ieviesu tajā šos “-_+()” simbolus, lai dzīve nešķistu kā medus...) Mēs varētu formulēt šādu izteiksmi:

Bet jums jāatzīst, ka mēs ne vienmēr zinām, kādas rakstzīmes tiek izmantotas rindā, taču mēs noteikti zinām, ka tajā nedrīkst būt cipari! Tāpēc loģiskāk būtu vienkārši uzrakstīt veidni, kurā tiktu izlaistas rindas skaitļi, nevis tie, kuros ir "Ak Dievs, cik daudz nesaprotamu simbolu!!!". Šeit ir pareizi sastādītas izteiksmes piemērs šādām problēmām:

$a = "a-_+()";
if(preg_match("/^[^0-9]+$/",$a)) echo "Nav skaitļu!";

Kā mēs to panācām? Mēs esam ievadījuši simbolu Bet! sākumā novietotais vāciņš "^" ([^0-9]) norāda, ka būs nevajadzētu Ceru, ka tas ir sakārtots

Nu ko, lēnām iesaiņosim... Došu divus piemērus ar paskaidrojumiem, kuru laikā uzzināsim, kā saglabāt meklēšanas rezultātu mainīgajā, un uzzināsim, kā pārbaudīt pasta adreses pareizību

Es to redzēju un saglabāju!

Mans emuārs

$a = " Mans emuārs";
preg_match("/ /", $a);

Regulārajā izteiksmē mēs aprakstījām visas iespējamās rakstzīmes, kuras var iekļaut saitē. Es vēlos pievērst uzmanību pēdiņām un “/” rakstzīmēm mūsu izteiksmē pirms tām ir slīpsvītra, kam tas paredzēts? Fakts ir tāds, ka "/" un citāts paši par sevi ir īpašas rakstzīmes. Un, lai veidne tos uztvertu kā parastus simbolus, mums tie ir jāpārmeklē. Ekrāna pielāgošana tiek veikta, pirms īpašajām rakstzīmēm pievienojot slīpsvītru. Es ceru, ka tas ir skaidrs

$a = " Mans emuārs";
preg_match("/ /", $a, $b);

Nu, attiecīgi, ir jāpievieno papildu parametrs mainīgā $b formā, kurā tiks saglabāta atrastā saite. Jums arī jāzina, ka meklēšanas rezultāts ir ievietots masīvā. Tāpēc mainīgais $b ir masīvs. Informācija, ko mēs meklējam, atrodas indeksā 1. Tas nozīmē, ka meklēšanas rezultāts ir mainīgajā $b. Parādīsim rezultātu ekrānā:

$a = " Mans emuārs";
preg_match("/ /", $a, $b);
atbalss $b;

Pareiza adrese ir panākumu atslēga!

Un visbeidzot atbilde uz jautājumu, vai e-pasts ir pareizs? Pirmkārt, jums ir jānoskaidro, kādas rakstzīmes ir atļautas adresēs? Cik es zinu, atļautās rakstzīmes ietver:

  • Angļu burti, cipari, “_”, “-” ummmm, šķiet, viss ir... Mēs turpināsim no tā.
  • Nākamais mums ir "@"
  • Pēc tam angļu burti
  • Nākamais punkts
  • Un atkal angļu burti...

Tātad regulārā izteiksme būs šāda:

$a = " [e-pasts aizsargāts]";
if(preg_match("/^+@+.+$/", $a)) echo "e-pasta adrese ir pareiza!";
else echo "e-pasta adrese NAV uzrakstīta pareizi!";

Nu... Es ceru, ka šādi ieraksti jūs tagad nebiedē, un jūs tos varat diezgan saprast.

Visbeidzot, es gribu kaut ko pateikt. Raksts izrādījās apgrūtinošs un tajā pašā laikā aptvēra tikai daļu no iespējām. Ja jūs lasāt šo teikumu, tad, visticamāk, esat to izlasījis līdz beigām, par ko liels paldies

Attiecībā uz rakstu sēriju par cms emuāra izveidi, sērijas pirmā daļa Es pasludinu to par slēgtu! Tuvākajā nākotnē mēs sāksim ieviest administratora paneli, tāpēc “nepārslēdzieties” Ja jums ir kādi jautājumi, es ar prieku atbildēšu. Visu to labāko jums, tas ir viss, kas man ir!

) Es parādīju piemēru regulāro izteiksmju izmantošanai, lai atrastu konkrētas lapas avota koda daļas. Tagad mēs paši iemācīsimies tos rakstīt. Šī prasme palīdzēs rakstīt, notīrīt tekstu no nevajadzīgiem fragmentiem, meklēt vajadzīgās daļas lielos teksta apjomos utt.

Šī tēma ir diezgan sarežģīta, bet es mēģināšu īsi aptvert lielāko daļu svarīgi punkti. Es nezinu, cik man veiksies, bet es ceru, ka nodarbība būs noderīga.
Tātad, sāksim ar faktu, ka darbam ar regulārām izteiksmēm PHP ir vairākas funkcijas, bet visbiežāk tiek izmantotas trīs:

  • preg_replace — meklēt un aizstāt tekstu, kas atbilst regulārai izteiksmei;
  • preg_match - tikai parasta meklēšana;
  • preg_split - meklēt un sadalīt tekstu.

Vismaz iepriekšējās nodarbībās mēs tos izmantojām. Precīzāk, preg_match vietā bija preg_match_all, bet tas būtībā ir tas pats, tikai pēdējais nepārtrauc meklēšanu pēc pirmā atraduma. Tas ir, ja mēs izmantojam preg_match, mēs neatradīsim visus gadījumus, bet tikai pirmo.

Izvēlēties, kuru funkciju kādā situācijā izmantot, ir pavisam vienkārši. Mums ir jāaizstāj — mēs izmantojam aizstājēju, tāpat kā gadījumā, kad mums bija jānoņem nevajadzīgās lapas koda daļas, atcerieties?

$lapa = preg_replace("/ ^]/i", "", $lapa); $lapa = preg_replace("/ ^]/i", "", $lapa); $lapa = str_replace("", "", $lapa);

Funkcijas pirmais parametrs ir regulāra rakstzīme, kas nosaka to, ko mēs meklējam. Otrais ir tas, ar ko mēs to aizstājam. Trešais - Kur mēs skatāmies? Tāpēc šeit mēs paņēmām mainīgo $page un piešķīrām tam funkcijas preg_replace rezultātu, kurā mēs meklējām visas ievades type=checkbox, kā arī atvēršanas un aizvēršanas etiķetes. Viņi tos aizstāja ar ", tas ir, viņi tos vienkārši izdzēsa. Es ceru, ka šeit viss ir skaidrs. Mēs pāriesim uz pašas izteiksmes (pirmā funkcijas parametra) analīzi nedaudz vēlāk.
Bija arī piemērs, kā izmantot preg_match_all, kas noderēja, lai atrastu visas saites atlikušajā tekstā. Toreiz mums bija vajadzīgas saites, jo tajās bija ietverti atslēgvārdi, kurus mēs analizējām. Lūk, kas notika:

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

Pirmais parametrs atkal ir regulārā izteiksme, lai atrastu visas saites, kas dabiski ir ietvertas tagā “a” (ja neesat pazīstams ar html iezīmēšanu, izlasiet). Otrais ir mainīgais, kas satur meklējamo tekstu. Trešais parametrs ir mainīgais, kurā tiek ievietots rezultāts - $ok. Pēc tam atliek tikai iet cauri visiem nepieciešamajiem $ok elementiem, lai iegūtu nepieciešamos atslēgas. Atsevišķi jāsaka, ka izejā mēs iegūstam daudzdimensiju masīvu. Tāpēc mēs to parādījām tik sarežģītā veidā: $ok[$j]. Lai apskatītu masīva struktūru, izmantojiet zemāk esošo funkciju, un jūs visu sapratīsit.

Print_r($ ok);

Šķiet, ka esam sakārtojuši funkcijas, kuras izmantojām savam darbam. Tagad atliek tikai iemācīties rakstīt šīs pašas regulārās izteiksmes, kas ir katras šīs metodes pirmais parametrs. Pāriesim pie vissvarīgākās lietas.

Kā uzrakstīt parastus teikumus

Vispirms apskatīsim pamatstruktūras. Izteiksmēm ir iespējas. Tie ir norādīti ar vienu burtu un rakstīti beigās, pirms kura ir slīpsvītra.

Turklāt tiek atbalstītas šādas metarakstzīmes:

Savukārt metarakstzīmēm var būt modifikatori:

Nu, tagad mēs varam pāriet uz mūsu parasto modeļu analīzi no pēdējās nodarbības. Pamatojoties uz iepriekš minētajām zīmēm, mēģināsim saprast, kas mums ir. Lūk, izteiciens:

/^]/i

Pirmā un pēdējā slīpsvītra “/” norāda, ka tajās ir regulāra izteiksme. Tajā pašā laikā pēc pēdējā ievietojam “i”, šī ir iespēja, tāpat kā pirmajā tabulā - neņem vērā reģistru. Slīpsvītru iekšpusē ir pati regulārā secība. Tas sākas ar mazāk nekā zīmi un ievades tagu, un viss, kas nāk pēc tam līdz perioda zīmei, ir tikai vienkāršs teksts, kas jāmeklē. Bet pats punkts un simboli pēc tā ir interesantāki. Šajā gadījumā konstrukcija “.*?” nozīmē jebkuru rakstzīmju secību. Tas ir, ja mēs apvienosim tikai tekstu un šo konstrukciju, tad mēs atlasīsim visu tekstu pēc pirmā gadījuma un līdz beigām. Lai apturētu, jums ir jāsastopas vai nu ar beigu HTML tagu “vairāk nekā”, vai ar jaunu rindiņas rakstzīmi. Šis dizains mums sniedz tieši šādu iespēju:

Rakstzīmes kvadrātiekavās ir savienotas ar loģisku VAI. Beigas ir lielāka nekā zīme VAI rindas sākums.
Tas ir viss izteiksme, tajā mēs iestatām sākuma nosacījumu, vidējo un beigu nosacījumu. Nav grūti, vai ne? Šeit ir ilustrācija skaidrības labad:

Apskatīsim vēl vienu lietu, lai visu nostiprinātu. Mēs meklējām saites ar viņiem:

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

Mēs lasām izteicienu. Atkal mēs vispirms atmetam slīpsvītras un opcijas. Karogi "uis" ir pašsaprotami, izņemot "u", kuru es neaprakstīju - tas parāda, ka mēs izmantojam Unicode kodējumu. Daudz vairs nav palicis. Sākums ir "a" atzīme, kas atveras, pēc tam nāk klase

kas nozīmē NAV lielāks vai mazāks par (HTML tagu atvēršana un aizvēršana), tas ir, šajā gadījumā jebkuras rakstzīmes. Klasei tiek pievienots “+?”, kas nozīmē, ka šī klase būs klāt 1 vai vairāk reizes (bet vismaz 1 reizi noteikti). Un tad nāk “a” taga noslēdzošais html tags. Saites iekšpusē ir teksts, ko norādījusi grupa

Galu galā mēs nezinām, kāda veida teksts tur būs, tāpēc mēs definējam šādu grupu. Un beigās ir noslēdzošais tags “a”:

Lūdzu, ņemiet vērā, ka mēs neizmantojam slīpsvītru, izmantojot atpakaļvērsto slīpsvītru, lai tas tiktu uztverts kā vienkāršs teksts.

Fū. Tēma tiešām ir diezgan sarežģīta, prasa praksi. Varbūt es daru kaut ko ne gluži optimāli un ir iespējams izveidot citas, pareizākas regulārās izteiksmes, bet esmu tikpat autodidakts kā jūs, tāpēc nevērtējiet strikti, bet dalieties ar savām iespējām komentāros. Tāpat, ja kaut kas nav skaidrs, komentāru un kontaktu lapa ir jūsu rīcībā.

Strādājot ar tekstiem jebkurā modernā programmēšanas valodā, izstrādātāji pastāvīgi saskaras ar uzdevumiem pārbaudīt ievadīto datu atbilstību vēlamajam modelim, meklēt un aizstāt testa fragmentus, kā arī citas tipiskas operācijas simboliskās informācijas apstrādei. Savu verifikācijas algoritmu izstrāde noved pie laika zaudēšanas, programmas koda nesaderības un sarežģītības tās izstrādē un modernizēšanā.

Interneta un WEB izstrādes valodu straujā attīstība prasīja izveidot universālus un kompaktus rīkus teksta informācijas apstrādei ar minimālu koda daudzumu, kas tam nepieciešams. PHP valoda, kas ir populāra iesācēju un profesionālu izstrādātāju vidū, nav izņēmums. Regulārā izteiksme kā teksta veidņu valoda ļauj vienkāršot teksta apstrādes uzdevumus un samazināt programmas kodu par desmitiem un simtiem rindiņu. Bez tā daudzas problēmas nevar atrisināt.

Regulāras izteiksmes PHP

PHP valoda satur trīs mehānismus darbam ar regulārām izteiksmēm - “ereg”, “mb_ereg” un “preg”. Visizplatītākā ir "preg" saskarne, kuras funkcijas nodrošina piekļuvi PCRE regulāro izteiksmju bibliotēkai, kas sākotnēji tika izstrādāta Perl valodai, kas ir iekļauta PHP. Preg funkcijas meklē atbilstības noteiktā teksta virknē atbilstoši noteiktam modelim regulārās izteiksmes valodā.

Sintakses pamati

Īsā rakstā nav iespējams detalizēti aprakstīt visu regulāro izteiksmju sintaksi, tam ir īpaša literatūra. Mēs piedāvājam tikai galvenos elementus, lai parādītu izstrādātāja plašās iespējas un saprastu kodu piemērus.

B formāli definēts ļoti sarežģīti, tāpēc vienkāršosim aprakstu. Regulāra izteiksme ir teksta virkne. Tas sastāv no norobežota raksta un modifikatora, kas norāda, kā to apstrādāt. Veidnēs iespējams iekļaut dažādas alternatīvas un atkārtojumus.

Piemēram, izteiksmē /\d(3)-\d(2)-\d(2)/m atdalītājs būs «/» , tad nāk raksts un simbols "m" būs modifikators.

Visa regulāro izteiksmju jauda ir kodēta, izmantojot metarakstzīmes. Valodas galvenā metarakstzīme ir atpakaļvērstā slīpsvītra - “\”. Tas apvērš tai sekojošā rakstzīmes veidu (t.i., parastais varonis kļūst par metaraksturu un otrādi). Vēl viena svarīga metarakstzīme ir slīpsvītra "|", kas norāda alternatīvas modeļa variācijas. Vairāk metarakstzīmju piemēru:

PHP, apstrādājot regulārās izteiksmes, atstarpi apstrādā kā atsevišķu zīmīgu rakstzīmi, tāpēc izteiksmes ABCWHERE un ABCWHERE atšķiras.

Apakšraksti

PHP parastie apakšraksti tiek atdalīti ar iekavām un dažreiz tiek saukti par "apakšizteiksmēm". Veiciet šādas funkcijas:

    Alternatīvu izcelšana. Piemēram, veidne siltums (kaut kas|putns|) atbilst vārdiem "siltums", "ugunsputns" Un "cepts". Un bez iekavām tā būtu tikai tukša virkne, “putns” un “cepetis”.

    "Aizraujošs" apakšmodelis. Tas nozīmē, ka, ja apakšvirkne sakrīt shēmā, visas atbilstības tiek atgrieztas kā rezultāts. Skaidrības labad sniegsim piemēru. Ņemot vērā šādu regulāro izteiksmi: uzvarētājs saņem((zelta|zeltītu)(medaļu|kausu)) - un rinda, lai atrastu atbilstības: "uzvarētājs saņem zelta medaļu". Papildus sākotnējai frāzei meklēšanas rezultāts atgriezīsies: "zelta medaļa", "medaļa", "zelts".

Atkārtošanas operatori (kvadrifikatori)

Rakstot regulārās izteiksmes, bieži ir jāanalizē skaitļu un simbolu atkārtojumi. Tā nav problēma, ja atkārtojumu nav ļoti daudz. Bet ko darīt, ja mēs nezinām precīzu to skaitu? Šajā gadījumā jums ir jāizmanto īpašas metarakstzīmes.

Lai aprakstītu atkārtojumus, tiek izmantoti kvadrifikatori - metasimboli, lai norādītu daudzumu. Kvadrifikatori ir divu veidu:

  • vispārīgs, iekavās;
  • saīsināti.

Vispārējais kvantētājs norāda minimālo un maksimālo atļauto elementa atkārtojumu skaitu, kas izteikts kā divi skaitļi krokainajās iekavās, piemēram: x(2,5). Ja maksimālais atkārtojumu skaits nav zināms, otrais arguments tiek izlaists: x(2,).

Saīsinātie kvantori ir visbiežāk sastopamo atkārtojumu simboli, lai izvairītos no nevajadzīgas sintakses jucekli. Parasti tiek izmantoti trīs saīsinājumi:

1. * - nulle vai vairāk atkārtojumu, kas ir līdzvērtīgs (0,).

2. + - viens vai vairāki atkārtojumi, t.i.,).

3. ? - nulle vai tikai viens atkārtojums - (0,1).

Regulāro izteiksmju piemēri

Tiem, kas mācās regulāras izteiksmes, piemēri ir labākā apmācība. Mēs piedāvāsim dažus, kas parāda to plašās iespējas ar minimālu piepūli. Visi programmu kodi ir pilnībā saderīgi ar PHP 4.x un jaunākām versijām. Lai pilnībā izprastu sintaksi un izmantotu visas valodas iespējas, iesakām J. Frīdla grāmatu “Regulārās izteiksmes”, kurā pilnībā apskatīta sintakse un ietverti regulāro izteiksmju piemēri ne tikai PHP, bet arī Python, Perl, MySQL, Java, Ruby un C#.

E-pasta adreses pareizības pārbaude

Uzdevums. Ir interneta lapa, kurā apmeklētājam tiek prasīta e-pasta adrese. Regulārajai izteiksmei pirms ziņojumu nosūtīšanas ir jāpārbauda, ​​vai saņemtā adrese ir pareiza. Pārbaude negarantē, ka norādītā pastkaste patiešām eksistē un pieņem vēstules. Bet tas var atsijāt acīmredzami nepareizas adreses.

Risinājums. Tāpat kā ar jebkuru programmēšanas valodu, PHP e-pasta adreses verifikācijas regulārās izteiksmes var ieviest vairākos veidos, un šajā rakstā minētie piemēri nav visizteiktākie. Tāpēc katrā gadījumā mēs nodrošināsim prasību sarakstu, kas jāņem vērā programmējot, un konkrētā realizācija ir pilnībā atkarīga no izstrādātāja.

Tātad izteiksmei, kas pārbauda, ​​vai e-pasts ir derīgs, ir jāpārbauda šādi nosacījumi:

  1. Simbola @ klātbūtne avota virknē un atstarpju trūkums.
  2. Adreses domēna daļā, kam seko simbols @, ir tikai domēna nosaukumiem derīgas rakstzīmes. Tas pats attiecas uz lietotājvārdu.
  3. Pārbaudot lietotājvārdu, jums ir jāmeklē īpašas rakstzīmes, piemēram, apostrofs vai Šīs rakstzīmes ir potenciāli bīstamas un var tikt izmantotas uzbrukumos, piemēram, SQL ievadīšanai. Izvairieties no šādām adresēm.
  4. Lietotājvārdos ir atļauts tikai viens punkts, kas nevar būt pirmā vai pēdējā rakstzīme rindā.
  5. Domēna nosaukumā ir jābūt vismaz divām un ne vairāk kā sešām rakstzīmēm.

Piemērs, kurā ņemti vērā visi šie nosacījumi, ir redzams zemāk attēlā.

URL derīguma pārbaude

Uzdevums. Pārbaudiet, vai dotā teksta virkne ir derīga Atkal URL pārbaudes regulārās izteiksmes var ieviest dažādos veidos.

Risinājums. Mūsu galīgā versija izskatās šādi:

/^(https?:\/\/)?([\da-z\.-]+)\.((2,6))([\/\w \.-]*)*\/?$ /

Tagad aplūkosim tā sastāvdaļas sīkāk, izmantojot attēlu.

Kredītkaršu numuru pārbaude

Uzdevums. Nepieciešams pārbaudīt ievadītā plastikāta kartes numura pareizību izplatītākajām maksājumu sistēmām. Iespēja tiek uzskatīta tikai par kartēm

Risinājums. Veidojot izteiksmi, jāņem vērā iespējamā atstarpju klātbūtne ievadītajā ciparā. Cipari uz kartes ir sadalīti grupās, lai atvieglotu lasīšanu un diktēšanu. Tāpēc ir gluži dabiski, ka cilvēks var mēģināt ievadīt numuru šādā veidā (t.i., izmantojot atstarpes).

Uzrakstīt universālu izteiksmi, kurā ņemtas vērā iespējamās atstarpes un defises, ir grūtāk nekā vienkārši izmest visas rakstzīmes, izņemot ciparus. Tāpēc izteiksmē ieteicams izmantot /D metarakstūru, kas noņem visas rakstzīmes, izņemot ciparus.

Tagad varat pāriet tieši uz numura pārbaudi. Visas kredītkaršu kompānijas izmanto unikālu skaitļu formātu. Piemērā tas tiek izmantots, un klientam nav jāievada uzņēmuma nosaukums - to nosaka numurs. Visa kartes vienmēr sākas ar 4, un to numura garums ir 13 vai 16 cipari. MasterCard sākas diapazonā no 51 līdz 55 ar skaitļa garumu 16. Rezultātā mēs iegūstam šādu izteiksmi:

Pirms pasūtījuma apstrādes varat veikt papildu skaitļa pēdējā cipara pārbaudi, kas tiek aprēķināts, izmantojot Luhn algoritmu.

Pārbauda tālruņa numurus

Uzdevums. Ievadītā tālruņa numura pareizības pārbaude.

Risinājums. Ciparu skaits fiksēto un mobilo tālruņu numuros dažādās valstīs ievērojami atšķiras, tāpēc nav iespējams vispārēji pārbaudīt tālruņa numura pareizību, izmantojot regulārās izteiksmes. Bet starptautiskajiem numuriem ir stingrs formāts, un tie ir lieliski piemēroti veidņu pārbaudei. Turklāt arvien vairāk valstu telefonu operatoru cenšas ievērot vienotu standartu. Numura struktūra ir šāda:

+CCC.NNNNNNNNNNxEEEE, Kur:

C ir valsts kods, kas sastāv no 1–3 cipariem.

N - līdz 14 cipariem garš numurs.

E - pēc izvēles pagarinājums.

Plus ir obligāts elements, un x zīme ir tikai tad, ja ir nepieciešama paplašināšana.

Rezultātā mums ir šāda izteiksme:

^\+(1,3)\.(4,14)(?:x.+)?$

Skaitļi diapazonā

Uzdevums. Jums ir jāatbilst veselam skaitlim noteiktā diapazonā. Turklāt ir nepieciešams, lai regulārās izteiksmes atbilstu tikai skaitļiem no vērtību diapazona.

Risinājums. Šeit ir daži izteicieni dažiem visbiežāk sastopamajiem gadījumiem:

IP adreses atrašana

Uzdevums. Jums ir jānosaka, vai norādītā virkne ir derīga IP adrese IPv4 formātā diapazonā no 000.000.000.000 līdz 255.255.255.255.

Risinājums. Tāpat kā jebkuram PHP uzdevumam, regulārām izteiksmēm ir daudz variāciju. Piemēram, šis:

Tiešsaistes izteiksmes pārbaude

Regulāro izteiksmju pareizības pārbaude jaunajiem programmētājiem var būt sarežģīta sintakses sarežģītības dēļ, kas atšķiras no “parastajām” programmēšanas valodām. Lai atrisinātu šo problēmu, ir daudz tiešsaistes izteiksmju testētāju, kas ļauj viegli pārbaudīt izveidotās veidnes pareizību reālā tekstā. Programmētājs ievada izteiksmi un pārbaudāmos datus un uzreiz redz apstrādes rezultātu. Parasti ir arī atsauces sadaļa, kurā ir sīki aprakstītas parastās izteiksmes, piemēri un ieviešanas atšķirības visbiežāk sastopamajām programmēšanas valodām.

Taču pilnībā uzticēties tiešsaistes pakalpojumu rezultātiem nav ieteicams visiem izstrādātājiem, kuri izmanto PHP. Regulāra izteiksme, kas uzrakstīta un pārbaudīta personīgi, uzlabo jūsu prasmes un garantē kļūdu neesamību.


Viena no ļoti spēcīgajām un noderīgajām PHP valodas funkcijām ir regulāro izteiksmju atbalsts. Daudzus programmētājus, gan iesācējus, gan diezgan pieredzējušus, iebiedē regulārās izteiksmes valodas šķietamā sarežģītība un sarežģītība. Bet varu jums apliecināt – tas ir tā vērts. Regulāro izteiksmju izmantošana ievērojami vienkāršo tekstu un vāji strukturētu datu apstrādes darbu.


Regulārās izteiksmes ir izteiksmes, kas rakstītas īpašā valodā. Neuztraucieties, valoda ir diezgan viegli saprotama, ir nepieciešama tikai pieredze un prakse.


Es domāju, ka esat vairākkārt saskāries ar situācijām, kad jums ir teksts (piemēram, Microsoft Word), un jums tajā jāatrod kaut kas svarīgs. Ja zināt, ko tieši meklējat, viss ir vienkārši: atveriet meklēšanas dialoglodziņu, ievadiet meklēšanas vārdu, nospiediet pogu un voila - teksts ir atrasts.


Bet ko jūs darīsit, ja iepriekš zināt tikai to, kāda veida informāciju meklējat? Piemēram, jūs saskaraties ar uzdevumu atrast visas e-pasta adreses pāris simtu lokšņu dokumentā. Daži skatīs dokumentu manuāli, daži ievadīs suni (@) meklēšanā un meklēs to. Piekrītu - abi varianti ir mugurkauls, nepateicīgs darbs.

Šeit palīgā nāk regulāras izteiksmes. Aptuveni regulāras izteiksmes var salīdzināt ar maskām vai veidnēm, kas ir uzklātas uz teksta: ja teksts atbilst maskai, tas ir vēlamais fragments. Bet pirms mēs apsvērsim regulāro izteiksmju izmantošanu, mēs iepazīsimies ar to sintaksi.

Regulārā izteiksme ir teksta virkne, kas veidota saskaņā ar noteiktiem likumiem un noteikumiem. Virkne sastāv no rakstzīmēm un rakstzīmju grupām, metarakstzīmēm, kvantoriem un modifikatoriem.

Šajā gadījumā simboli nozīmē jebkurus jebkura alfabēta simbolus. Un ne tikai lasāmās. Lai to izdarītu, izteiksmē var viegli ievietot nelasāmu rakstzīmi, jums tikai jāzina tās kods heksadecimālā formā. Piemēram:

// lasāmas rakstzīmes a E // nelasāmas rakstzīmes un kodi \x41 - tas pats, kas burts "A" \x09 - tabulēšanas rakstzīme

Rakstzīmju grupa ir vairākas rakstzīmes, kas rakstītas secīgi:

Abvg ACZms

Tūlīt gribu vērst jūsu uzmanību - arī “atstarpe” regulārajās izteiksmēs tiek uzskatīta par nozīmīgu rakstzīmi, tāpēc esiet piesardzīgs, rakstot izteicienus. Piemēram, šīs rakstzīmju grupas ir DAŽĀDAS izteiksmes:

ABC KUR ABC KUR

Nākamais valodas elements ir metaraksti. Prefikss "meta" nozīmē, ka šie simboli apraksta dažus citus simbolus vai to grupas. Tabulā ir aprakstītas regulārās izteiksmes valodas galvenās metarakstzīmes:

Metaraksti speciālo rakstzīmju norādīšanai
() Iekavas. Definē ligzdotas izteiksmes.
| Atlases metaraksts
^ Rindas sākuma metaraksts
$ Rindas beigu metaraksts
\n Rindas plūsmas rakstzīme (heksadecimālais kods 0x0A)
\r Karieta atgriešanas rakstzīme (heksadecimālais kods 0x0D)
\t Tabulēšanas rakstzīme (heksadecimālais kods 0x09)
\xhh Ievietojot rakstzīmi ar heksadecimālo kodu 0xhh, piemēram, \x42, tiks ievietots latīņu burts "B"
Metarakstzīmes rakstzīmju grupu norādīšanai
. Punkts. Jebkurš varonis.
\d Cipars (0-9)
\D Nav cipars (jebkura rakstzīme, izņemot rakstzīmes 0-9)
\s Tukša rakstzīme (parasti atstarpe un tabulēšana)
\S Rakstzīme, kas nav tukša (visas, izņemot rakstzīmes, kuras identificē ar metarakstzīmi \s)
\w "Vārdnīcas" rakstzīme (rakstzīme, ko lieto vārdos. Parasti visi burti, visi cipari un pasvītra ("_"))
\W Visas, izņemot rakstzīmes, ko nosaka \w metaraksts

Metaraksturus no tabulas otrās puses ir ļoti viegli atcerēties. "d" - cipars (cipars), "s" - simbols (simbols), "w" - vārds (vārds). Ja burts ir liels, tad grupas aprakstam jāpievieno “NOT”.

Ņemsim, piemēram, tekstu “Sarkanajā krekliņā ir skaitļi 1812, bet zaļajā krekliņā ir skaitļi 2009”. Apskatīsim vienkāršāko regulāro izteiksmju piemērus:

\d\d\d\d - atradīs 1812 un 2009 \D - atradīs visus burtus, atstarpes un pieturzīmes \s - atradīs visas atstarpes tekstā.

Bet gadu mūsu piemērā var rakstīt nevis ar četriem, bet ar diviem cipariem, vārdiem var būt arī citas deklinācijas utt. Šeit var palīdzēt rakstzīmju apakškopas, kas norādītas, izmantojot kvadrātiekavas:

Nozīmē jebkuru ciparu (tāds pats kā \d) - nozīmē pāra ciparu - nozīmē jebkuru latīņu alfabēta simbolu (jebkurā gadījumā) vai ciparu.

Piemēram, izteiksme \d\d\d testa virknē atradīs tikai 1812, bet ne 2009. Šī izteiksme ir jālasa šādi: "atrast visas četru ciparu secības, kurās pēdējais cipars ir 0,2,4,6 vai 8"

Mums atliek tikai pieminēt kvantorus un modifikatorus.

Kvantifikators ir īpaša konstrukcija, kas nosaka, cik reižu ir jāparādās rakstzīmei vai rakstzīmju grupai. Kvantifikators ir rakstīts cirtaini iekavās "()". Ir iespējami divi ierakstīšanas formāti: precīzs un diapazons. Precīzi formāts ir rakstīts šādi:

Šeit X ir skaits, cik reižu ir jāatkārto iepriekšējais simbols vai grupa. Piemēram, izteiksme

Otrs ierakstīšanas veids ir diapazons. Ierakstīts kā

(X, Y) // vai (,Y) // vai (X,)

kur X ir minimālais un Y ir maksimālais atkārtojumu skaits. Piemēram:

lasīt kā "secīgi rakstīti divi līdz četri cipari". Ja viena no robežām nav norādīta, netiek pieņemts nekāds ierobežojums. Piemēram:

\w(3,) — trīs vai vairāk burti. \d(,5) - skaitļu nav vispār vai ir, bet ne vairāk kā pieci.

Kvantifikatorus var lietot vai nu vienai rakstzīmei, vai grupai:

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

Šī konstrukcija no teksta atlasīs visus krievu vārdus ar vienu, diviem vai trīs burtiem (piemēram, "vai", "nē", "es", "es eju" utt.).

Papildus krokainajām lencēm ir vēl trīs kvantatora metarakstzīmes: “*” (zvaigznīte), “+” (pluss) un “?” (jautājums). Tos izmanto gadījumos, kad minimālais un maksimālais nepieciešamo atkārtojumu skaits iepriekš nav zināms. Piemēram, meklējot e-pasta adreses, jūs nevarat iepriekš pateikt, cik rakstzīmju būs lietotājvārdā (pirms "suns") un cik daudz - domēna nosaukumā (pēc "suns").

Metaraksts "*" tiek lasīts kā "jebkura summa no nulles vai vairāk", t.i. dizains

definē jebkuru secīgu burtu skaitu, ieskaitot to pilnīgu neesamību.

Simbols "+" atšķiras no zvaigznītes tikai ar to, ka tam ir nepieciešama vismaz viena rakstzīme. Tie. dizains

saskaņo jebkuru ciparu secību ar vienu vai vairākiem cipariem.

Simbols "?" atbilst vienas rakstzīmes neesamībai vai klātbūtnei. Tie. dizains

saskaņo jebkuru digitālo secību ar vienu vai diviem cipariem.

Šeit ir vērts pieminēt tādu antiifieru “*” un “+” iezīmi kā alkatība. Lieta ir tāda, ka pēc noklusējuma šīs rakstzīmes atbilst pēc iespējas garākajai rakstzīmju secībai. Piemēram, rindai “mamma mazgāja rāmi” izteiksme:

izvēlēsies “mama soap ra”, kas ir nedaudz negaidīti, jo cerējām, ka dabūsim “ma”. Lai mainītu šo darbību, izmantojiet metarakstūru "?" (jautājuma zīme), kas rakstīts uzreiz aiz kvantatora. Tas ierobežo kvantoru "apetīti", liekot tiem atgriezties pirmajā, nevis garākajā sakritībā. Tagad mainīsim iepriekšējo piemēru:

un iegūstiet nepieciešamo spēli "ma".

Pēdējais valodas elements ir modifikatori. Modifikators ir īpaša rakstzīme, kas definē “sistēmas” parametrus regulāro izteiksmju analīzei. Ir tikai četri šādi simboli, tos var izmantot gan atsevišķi, gan vienlaikus:

i Iespējo reģistrjutīgo režīmu, t.i. lielie un mazie burti izteiksmē neatšķiras.
m Norāda, ka meklējamais teksts ir jāuzskata par sastāvošu no vairākām rindiņām. Pēc noklusējuma regulārās izteiksmes programma tekstu apstrādā kā vienu virkni neatkarīgi no tā, kāda tā patiesībā ir. Attiecīgi metarakstzīmes "^" un "$" norāda visa teksta sākumu un beigas. Ja šis modifikators ir norādīts, tie attiecīgi norādīs katras teksta rindiņas sākumu un beigas.
s Noklusējuma metarakstzīme ir "." definīcijā neiekļauj jaunrindas rakstzīmi. Tie. vairākrindu tekstam izteiksme /.+/ atgriezīs tikai pirmo rindiņu, nevis visu tekstu, kā paredzēts. Norādot šo modifikatoru, šis ierobežojums tiek noņemts.
U Pēc noklusējuma visas kvantitatīvās metarakstzīmes padara "nav mantkārīgas". Dažās valodas modifikācijās (īpaši PHP) “U” vietā tiek izmantota rakstzīme “g”, kas vairāk atbilst nozīmei (“g” ir saīsinājums no angļu valodas “greedy”, “greedy” ).

Tabulā parādīti populārākie un nepieciešamie regulāro izteiksmju piemēri. Daži no tiem jums var šķist sarežģīti un apgrūtinoši, taču, rūpīgi izpētot, jūs noteikti sapratīsit.

Regulāras izteiksmes PHP.

Ir īpašas funkcijas darbam ar regulārām izteiksmēm PHP, kuru saraksts un īss apraksts ir sniegts tabulā:

int preg_match (virknes modelis, virknes priekšmets [, masīva atbilstības])

Funkcija pārbauda, ​​vai objekta saturs atbilst paraugam. Atgriež 1, ja tiek atrastas atbilstības, pretējā gadījumā atgriež 0. Ja norādāt neobligāto atbilstības masīva parametru, tad, kad funkcija tiks izpildīta, tajā tiks ievadīts viens elements - pirmā atrastā atbilstība.

"; print_r($atrasts); ?>

int preg_match_all (virknes modelis, virknes priekšmets, masīvs atbilst [, int secība])
Funkcija ir identiska iepriekšējai, ar vienīgo atšķirību – tā pārmeklē visu tekstu un atgriež VISAS sakritības masīvā atrastās atbilstības.
jaukts preg_replace (jaukts raksts, jaukta aizstāšana, jaukts temats [, iekšējais ierobežojums])
Tāpat kā abas tās priekšgājējas funkcijas, preg_replace meklē teksta daļu, kas atbilst paraugam. Funkcija visus atrastos fragmentus aizstāj ar parametros norādīto tekstu.Pirms tīrīšanas:\n$teksts\n\n"; $teksts = preg_replace("/(\n \s(2,))/"," ",$text); echo " Pēc tīrīšanas:\n$text"; // parādīs tekstu, kas notīrīts no speciālajām rakstzīmēm // un papildu atstarpēm?>
jaukts preg_replace_callback (jaukta shēma, jaukta atzvanīšana, jaukta tēma [, iekšējais ierobežojums])
Funkcija ir iepriekšējās paplašināta versija. Galvenā atšķirība ir tā, ka šai funkcijai parametros tiek nodots tās funkcijas nosaukums, kas analizēs tekstu un ģenerēs aizstājošo tekstu.
masīvs preg_split (virknes modelis, virknes priekšmets [, int limits [, int karodziņi]])
Šī funkcija ir līdzīga eksplode() un split() funkcijām. Tā īpatnība ir tāda, ka atdalītājs nav fiksēta virkne, bet gan regulāra izteiksme. Funkcija sadala avota datus elementos un ievieto tos izvades masīvā.
masīvs preg_grep (virknes raksts, masīva ievade)
Funkcija ir paredzēta regulārai meklēšanai masīvos. Meklēšanai tiek norādīta veidne un ievaddatu masīvs, un tiek atgriezts masīvs, kas sastāv tikai no elementiem, kas atbilst veidnei.

Apskatīto funkciju saraksts nebūt nav pilnīgs, taču tas ir pilnīgi pietiekams, lai veiksmīgi sāktu darbu ar regulārām izteiksmēm. Ja jūs interesē šī tēma, noteikti izlasiet papildu literatūru (piemēram, Frīdla grāmatu “Regulārās izteiksmes”). Turklāt apmācības nolūkos iesaku instalēt kādu no speciālajām programmām regulāro izteiksmju pārbaudei (piemēram, "PCRE" vai "RegEx Builder").

1,6 tūkst

Regulāras izteiksmes (saīsināti kā regex) ir rakstzīmju secības, kas veido meklēšanas modeļus. Tos galvenokārt izmanto virkņu saskaņošanas modeļos.

Īsa vēsture

  • Viss sākās 20. gadsimta 40. līdz 60. gados, kad daudzi gudri cilvēki runāja par regulārām izteiksmēm;
  • 1970. gadi g/re/p;
  • 1980 Perls un Henrijs Spensers;
  • 1997 PCRE (Perl Compatible Regular Expressions). Šajā laikā sākās to, ko mēs saucam par regulārām izteiksmēm, attīstība. PCRE nodrošina bibliotēkas gandrīz visām valodām.

Vispārīgs regulāro izteiksmju lietojums PHP

PHP ietver trīs galvenās funkcijas darbam ar PCRE - preg_match, preg_match_all un preg_replace.

Atbilstības salīdzinājums

Izteiksme atgriež 1, ja tiek veikta atbilstība, 0, ja tā nav, un false, ja rodas kļūda:

int preg_match (virkne $pattern, virkne $subject [, masīvs &$atbilst [, int $flags = 0 [, int $offset = 0 ]]])

Piemērs regulārai izteiksmei, kas atgriež atrasto atbilstību skaitu:

int preg_match_all (virkne $pattern, virkne $subject [, masīvs &$atbilst [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]])

Aizstāšana

Izteiksme atgriež aizstāto virkni vai masīvu ( pamatojoties uz $subject):

jaukts preg_replace (jaukts $raksts, jaukts $aizvietojums, jaukts $subject [, int $limit = -1 [, int $count ]])

Vispārēja regulāro izteiksmju lietošana JavaScript

JavaScript regulārās izteiksmes izskatās gandrīz tāpat kā PHP.

Atbilstības salīdzinājums

Atgriež atbilstības masīvu vai nulli, ja nav atrasta neviena atbilstība:

string.match(RegExp);

Aizstāšana

Regulāra izteiksme, kas atgriež virkni ar veiktajām nomaiņām:

string.replace(RegExp, aizstāšana);

Regulāro izteiksmju funkcijas JavaScript

  • Punkts nekad neatbilst jaunajai rindai:
  • Tās pašas metodes atbilstības un aizstāšanas salīdzināšanai, izmantojot regulāro izteiksmi, kā bez tām.

Regulāro izteiksmju modeļu veidošanas principi

Apskatīsim piemēru, kur kodu bāzē jāatrod e-pasta adreses. Mūsu mērķis:

Analogās ligzdas

Regulāras izteiksmes sastāv no divu veidu rakstzīmēm:

  • īpašās rakstzīmes: ? * + () () ^ $ / .
  • Literāļi.

Uztveriet ievades virknes kā skrūves un veidni kā to savienotāju komplektu (atbilstošā secībā).

Īpašas rakstzīmes

Pārbaudot regulārās izteiksmes, jums jāzina, kā darbojas īpašās rakstzīmes:

  • Slīpssvītra \ var aizstāt citu īpašo rakstzīmi regulārā izteiksmē:
  • Punkts un w - .

Atbilst visām rakstzīmēm, izņemot jaunās rindiņas. Ja vēlaties pārbaudīt atbilstību punktam un tikai punktam - , atbilstību burtiem, cipariem un pasvītrām - w

  • Kvadrātiekavas.

Saskaņojiet rakstzīmes iekavās. Atbalsta diapazonus. Daži piemēri:
o — atbilst jebkuram a, b vai c.
o lielie burti.
o jebkuru numuru.
o — atbilst jebkuram mazajam vai lielajam alfabēta rakstzīmēm.
Pēc izvēles? Atbilst 0 vai 1.
Zvaigznīte *.

Zvaigznīte apzīmē 0 vai vairāk rakstzīmju.

Atbilst 1 vai vairākām rakstzīmēm.

Cirtaini breketes ().

Minimālās un maksimālās vērtības. Daži regulārās izteiksmes sintakses piemēri:
o (1,) ne mazāk kā 1.
o (1,3) no 1 līdz 3.
o (1,64) no 1 līdz 64.

Pievienosim to visu, lai iegūtu regulāru izteiksmi e-pasta adresēm:

/+@+(.+)*/i


Lūk, kā tas izskatās PHP:

preg_match_all("/+@+(.+)*/i", $ievades_rindas, $izejas_masīvs);

Regulārās izteiksmes izmantošana apstiprināšanai

Izaicinājums: nodrošiniet, lai ievades dati būtu tādi, kādus mēs sagaidām. 1. mērķis: /[^w$.]/ 2. mērķis: /^(1,2)$/

Regulāras izteiksmes ir piemērotas elementu atrašanai, taču jums ir jāzina, ko tieši meklējat.

Kad validācijai nevajadzētu izmantot regulāro izteiksmi?

Daudzus gadījumus labāk apstrādāt, izmantojot PHP filtru_var funkciju. Piemēram, e-pasta adreses validācija jāveic, izmantojot PHP iebūvētos filtrus:

filter_var(" [e-pasts aizsargāts]", FILTER_VALIDATE_EMAIL)

Validācija, izmantojot regulārās izteiksmes

Regulāras izteiksmes rindas beigās izmanto enkurus:

^ - norāda rindas sākumu.
$ ir dolāra zīme, kas norāda rindas beigas.

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

Izslēgtās rakstzīmju klases

[^abc] — viss, izņemot a, b vai c, ieskaitot jaunās rindiņas.

Piemērs, kas ļauj ievadīt tikai burtciparu rakstzīmes, domuzīmes, punktus un pasvītras:

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

Meklēt un aizstāt

Visizplatītākās PCRE funkcijas meklēšanai un aizstāšanai ir preg_replace() un preg_replace_callback() . Bet ir arī preg_filter() un preg_replace_callback_array(), kas veic gandrīz to pašu. Lūdzu, ņemiet vērā, ka funkcija preg_replace_callback_array() ir pieejama kopš PHP7.

Aizstāt vārdus sarakstā

$subject = "Es gribu apēst ābolus."; echo preg_replace("/ābols|banāns|apelsīns/", "auglis", $tēma);

Rezultāts

Es gribu ēst dažus augļus.

Ja regulārajai izteiksmei ir apakšraksti ( iekavās), varat aizstāt $N vai N (kur N ir vesels skaitlis >= 1), to sauc par "atpakaļsaiti".

Divu skaitļu pārkārtošana

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

Rezultāts

Mainiet datuma formatējumu

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

Rezultāts

Vienkāršs piemērs URL aizstāšanai tagā

$subject = "Lūdzu, apmeklējiet https://php.earth/doc, lai iegūtu vairāk rakstu."; echo preg_replace("#(https?://([^s./]+(?:[^s./]+)*[^s]*))#i", "$2", $subject) ;

Rezultāts