php կանոնավոր արտահայտության համարը. PHP դասեր - կանոնավոր արտահայտություններ օրինակներով: Apache տեղեկամատյանների վերլուծություն

Ես վաղուց էի ուզում սովորել կանոնավոր արտահայտությունների մասին: Չնայած «հասկանալ»-ը ուժեղ բառ է: Հասկանալ մեծ արվեստը և դառնալ վարպետ կանոնավոր արտահայտություններպետք է անընդհատ գործ ունենալ դրանց հետ: Բավական չէ ուսումնասիրել շարահյուսությունը, հատուկ նիշերը և փոփոխիչները, դուք պետք է կարողանաք օգտագործել դրանք: Իսկ օգտագործելու ունակությունը գալիս է փորձի հետ:

Այս գրառման մեջ ես կներկայացնեմ կանոնավոր արտահայտությունների օգտագործման օրինակներ, որոնք ես ինքս եմ պարզել:

Հատուկ նիշերի աղյուսակ

Հատուկ կերպար Նկարագրություն
\ Վահանի խորհրդանիշ. Օրինակ: «/seo\/smo/»— համապատասխանում է մի տողի, որը պարունակում է seo/smo:
^ Տվյալների սկզբի խորհրդանիշը: Օրինակ: '/^seo/'— համապատասխանում է մի տողի, որը սկսվում է seo բառով:
$ Տվյալների նիշի ավարտը: Օրինակ: «/բլոգ$/»համընկնում է տողի հետ, որն ավարտվում է բլոգ բառով:
. Նոր տողից բացի ցանկացած կերպար: Օրինակ: «/seo.ult/»— համապատասխանում է լարային seoopult, seo9ult, [էլփոստը պաշտպանված է]և այլն:
Այս փակագծերի ներսում թվարկված են նիշերը, որոնցից ցանկացածը կարող է լինել տվյալ վայրում, բայց միայն մեկը: Օրինակ: «/սեուլտ/»— կհամընկնեն միայն seopult, seokult կամ seomult պարունակող տողերը:
| Կամ. Օրինակ՝ ստորև։
() ենթաօրինաչափություն.
? Նախորդ նիշի կամ ենթապատկերի մեկ կամ զրոյական երևույթ:
* Նախորդ նիշի կամ ենթապատկերի ցանկացած քանակի երևույթ: Այդ թվում՝ զրո։
+ Մեկ կամ մի քանի գրառում:
Օրինակ: '/se+(op|om)?.*t/'- s տառը, այնուհետև մեկ կամ մի քանի e տառ, որից հետո op կամ om համակցությունը կարող է առաջանալ մեկ անգամ, կամ գուցե երբեք, հետո ցանկացած նիշի և t տառի ցանկացած քանակ:
(ա, բ) Նախորդ նիշի կամ ենթապատկերի առաջացման քանակը a-ից մինչև b: Օրինակ՝ (0,) նույնն է, ինչ *, (0,1) նույնն է, ինչ ?, (3,5) 3, 4 կամ 5 կրկնություն է:

Պարզ php օրինակներսկրիպտներ՝ օգտագործելով կանոնավոր արտահայտություններ:

1) Նախորդ և հաջորդ արտահայտությունները.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // գտի՛ր մի բառ, որը Box-ից հետո ունի ing: Եթե ​​բառը գտնվի, ֆունկցիան կվերադարձնի true, եթե ոչ՝ false:$pattern1 = "/Box(?=ing)/" ; preg_match ($pattern1, «Box Day»); // false preg_match ($pattern1, «Boxing Day»); // ճիշտ // գտիր բառ, որը տուփից հետո ing չունի: Եթե ​​բառը գտնվի, ֆունկցիան կվերադարձնի true, եթե ոչ՝ false:$pattern2 = "/box(?!ing)/" ; preg_match ($pattern2, «Box iPhone-ի և iPad-ի համար»); // true preg_match ($pattern2 , "What is boxing day?" ); // false preg_match ($pattern2, "css-moz-box-shadow"); // ճիշտ // ing-ից առաջ գտիր բառ, որը տուփ չունի: Եթե ​​բառը գտնվի, ֆունկցիան կվերադարձնի true, եթե ոչ՝ false:$pattern3 = «/(?

[^<]+?~","seo blog",$text); echo $text; ?>

3) Ստացեք և ցուցադրեք տվյալ կայքի Alexa Rank արժեքը։

1 2 3 4 5 6 7 8 9 "#
(.*?)
#սի", file_get_contents( «http://www.alexa.com/siteinfo/($url)») , $ա ) ; վերադարձի կտրվածք (str_replace ("," , "" , strip_tags ($a [ 1 ] ) ) ; ) $alexa = alexa($url); արձագանք $alexa ; ?>

(.*?)

#si", file_get_contents ("http://www.alexa.com/siteinfo/($url)"), $a); վերադարձի կտրվածք(str_replace(",","",strip_tags($a))); ) $alexa = alexa ($url); echo $alexa; ?>

4) Ստացեք և ցուցադրեք էջի անվանումը:

1 2 3 4 5 (.*)<\/title>/s" , $str , $m ) ; echo $m [ 1 ] ; ?>

(.*)<\/title>/s", $str, $m); echo $m; ?>

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 \n \r \t ]/", "" , $content ); // փոխարինելով նոր տողի և ներդիրի նիշերը բացատով$content = preg_replace ("/(2,)/" , " " , $content ); // փոխարինել ավելի քան 2 բացատ մեկով preg_match_all("/ ]*href=(?:"| \" )(.*)(?:"|\" )[^<>]*>(.*)<\/a>/iU», $բովանդակություն, $links ); // հավաքել հղումներ, եթե (sizeof ($links [ 1 ] ) > 0 ) // եթե գտնվեն հղումներ($out = զանգված() ; // արտաքին հղումների զանգված foreach ($links [1] որպես $v) ( if (preg_match ("/http:\/\/(www\.)(0,1)" . $domain. "/i", $v)) // ջնջել ներքին հղումները(շարունակություն ;) եթե (preg_match ( «/(http:|https:)?\/\/(www\.)(0,1)(.*)/i", $v )) // արտաքին հղում($out = $v;)) վերադարձնել $out; ) վերադարձի զանգված(); ) $domain = "կայք" ; $content = file_get_contents ("http://site/"); $getoutlinks = getoutlinks($content, $domain); համար ($i = 0; $i<= count ($getoutlinks ) ; $i ++ ) { echo $getoutlinks [ $i ] . "
" ; } ?>

]*href=(?:"|\")(.*)(?:"|\")[^<>]*>(.*)<\/a>/iU», $content, $links); // հավաքել հղումներ, եթե (sizeof($links) > 0) // եթե հղումներ գտնվեն ( $out = array(); // արտաքին հղումների զանգվածը foreach ($links as $v ) ( if (preg_match("/http:\/\/(www\.)(0,1)".$domain."/i", $v)) // ջնջել ներքին հղումները (շարունակել; ) if (preg_match ("/(http:|https:)?\/\/(www\.)(0,1)(..com/"); $getoutlinks = getoutlinks($content, $domain); համար ( $i = 0;$i<= count($getoutlinks); $i++) { echo $getoutlinks[$i]."
"; } ?>

որտեղ:
preg_replace- Կատարում է որոնում և փոխարինում՝ օգտագործելով կանոնավոր արտահայտություն:
preg_match— ստուգում է կանոնավոր արտահայտության նկատմամբ:
preg_match_all- գտնում է բոլոր համընկնումները, մինչդեռ preg_match - միայն առաջինը:
file_get_contents- ստացեք ֆայլի բովանդակությունը մեկ տողով:
կտրել- Հեռացնում է տողի սկզբում և վերջում բացատները:
str_replace- փոխարինում է որոնման տողը փոխարինող տողով:
strip_tags- հեռացնում է html և php պիտակները տողից:
չափը- Ստանում է փոփոխականի տարրերի քանակը:
հաշվել- հաշվում է զանգվածի տարրերի թիվը կամ օբյեկտի հատկությունների քանակը:

խառը preg_match(լարային օրինաչափություն, լարային թեմա [, զանգված &համընկնում է [, int դրոշներ [, int offset]]])

Փնտրում է տրված տեքստի թեման՝ նախշի հետ համընկնելու համար

Եթե ​​ընտրովի համընկնումների պարամետրը նշված է, այն կլցվի որոնման արդյունքներով: $matches տարրը կպարունակի տողի այն մասը, որը համընկնում է ամբողջ օրինաչափության առաջացմանը, $matches տողի այն մասը, որը համապատասխանում է առաջին ենթաօրինաչափությանը և այլն։

դրոշները կարող են վերցնել հետևյալ արժեքները.

PREG_OFFSET_CAPTURE

Եթե ​​այս դրոշը նշված է, յուրաքանչյուր հայտնաբերված ենթատողի համար կնշվի դրա դիրքը սկզբնաղբյուրի տողում: Պետք է հիշել, որ այս դրոշը փոխում է վերադարձված տվյալների ձևաչափը. յուրաքանչյուր երևույթ վերադարձվում է որպես զանգված, որի զրոյական տարրը պարունակում է գտնված ենթատողը, իսկ առաջին տարրը պարունակում է օֆսեթ։ Այս դրոշը հասանելի է PHP 4.3.0 և ավելի նոր տարբերակներում:

Լրացուցիչ դրոշակների պարամետրը հասանելի է PHP 4.3.0-ից:

Որոնումը կատարվում է ձախից աջ՝ տողի սկզբից։ Ընտրովի օֆսեթ պարամետրը կարող է օգտագործվել որոնման այլընտրանքային մեկնարկային դիրքը նշելու համար: Լրացուցիչ օֆսեթ պարամետրը հասանելի է PHP 4.3.3-ի դրությամբ:

Մեկնաբանություն:Օֆսեթ պարամետրի օգտագործումը համարժեք չէ ֆունկցիան կանչելիս համապատասխան տողը substr($subject, $offset)-ով փոխարինելուն: preg_match_all(), քանի որ նախշը կարող է պարունակել այնպիսի պայմաններ, ինչպիսիք են ^ , $ կամ (? . Համեմատել.

Մինչդեռ այս օրինակը

Գործառույթ preg_match ()վերադարձնում է հայտնաբերված համընկնումների քանակը: Այն կարող է լինել 0 (համընկնումներ չեն գտնվել) և 1, քանի որ preg_match ()ավարտվում է առաջին հայտնաբերված համընկնումից հետո: Եթե ​​Ձեզ անհրաժեշտ է գտնել կամ հաշվել բոլոր համընկնումները, դուք պետք է օգտագործեք գործառույթը preg_match_all(). Գործառույթ preg_match ()վերադառնում է ՍՈՒՏկատարման ընթացքում որևէ սխալ առաջանալու դեպքում:

Հուշում.Մի օգտագործեք գործառույթը preg_match (), եթե ցանկանում եք ստուգել տվյալ տողի մեջ ենթալարի առկայությունը։ Օգտագործեք դրա համար strpos ()կամ strstr(), քանի որ նրանք շատ ավելի արագ կկատարեն այս խնդիրը։


Օրինակ 2. Տեքստում գտնել «վեբ» բառը

/*
Նախշի հատուկ \b հաջորդականությունը նշանակում է բառի սահման,
հետևաբար, «վեբ» բառի միայն առանձին երևույթը կհամընկնի
դիմակ՝ ի տարբերություն «սարդոստայնի» կամ «սարդոստայնի»։
*/
if (preg_match("/\bweb\b/i" , «PHP-ն ընտրված վեբ սկրիպտավորման լեզու է»:)) {
արձագանք «Մուտքը գտնված է».;
) ուրիշ (
արձագանք «Մուտքը չի գտնվել»:;
)preg_match("/\bweb\b/i", «PHP-ն վեբկայքի սկրիպտավորման նախընտրելի լեզու է»:)) {
արձագանք «Մուտքը գտնված է».;
) ուրիշ (
արձագանք «Մուտքը չի գտնվել»:;
}
?>

Կանոնավոր արտահայտությունները տեքստում ենթատող փնտրելու հատուկ նախշեր են: Նրանց օգնությամբ դուք կարող եք լուծել նման խնդիրները մեկ տողով. «ստուգեք, արդյոք տողը թվեր է պարունակում», «տեքստում գտնել բոլոր էլփոստի հասցեները», «փոխարինել մի քանի հաջորդական հարցականները մեկով»:

Սկսենք մեկ հայտնի ծրագրավորման իմաստությունից.

Ոմանք, երբ բախվում են խնդրին, մտածում են. «Այո, ես խելացի եմ, կանոնավոր արտահայտություններով կլուծեմ»: Հիմա նրանք երկու խնդիր ունեն.

Կաղապարների օրինակներ

Սկսենք մի քանի պարզ օրինակներից։ Ստորև նկարում առաջին արտահայտությունը փնտրում է 3 տառերի հաջորդականություն, որտեղ առաջին տառը «k» է, երկրորդը ցանկացած ռուսերեն տառ է, իսկ երրորդը «t» է մեծատառերով (օրինակ՝ «կոտ» կամ «CAT»-ը համապատասխանում է այս օրինաչափությանը): Երկրորդ արտահայտությունը որոշ ժամանակ որոնում է տեքստը 12:34 ձևաչափով:

Ցանկացած արտահայտություն սկսվում է սահմանազատող նիշով (անգլերեն՝ սահմանազատող): Նիշը / սովորաբար օգտագործվում է որպես այն, բայց այլ նիշեր, որոնք հատուկ նպատակ չունեն կանոնավոր արտահայտություններում, ինչպիսիք են ~, # կամ @, կարող են օգտագործվել: Այլընտրանքային սահմանազատիչներ օգտագործվում են, եթե / նիշը կարող է հայտնվել արտահայտության մեջ: Այնուհետև գալիս է մեր փնտրած տողի ձևանմուշը, որին հաջորդում է երկրորդ սահմանազատիչը, և վերջում կարող են հայտնվել մեկ կամ մի քանի դրոշի տառեր: Նրանք լրացուցիչ ընտրանքներ են սահմանում տեքստ որոնելիս: Ահա դրոշների օրինակներ.

  • i - ասում է, որ որոնումը պետք է լինի մեծատառերի անզգայուն (գործերի զգայունությունը լռելյայնորեն)
  • u - ասում է, որ արտահայտությունը և որոնվող տեքստը օգտագործում են utf-8 կոդավորումը, ոչ միայն լատինական տառերը: Առանց դրա, ռուսերեն (և ցանկացած այլ ոչ լատիներեն) նիշերի որոնումը կարող է ճիշտ չաշխատել, այնպես որ դուք միշտ պետք է դրեք այն:

Կաղապարն ինքնին բաղկացած է սովորական նիշերից և հատուկ ձևավորումներից: Դե, օրինակ, «k» տառը կանոնավոր արտահայտություններում նշանակում է ինքն իրեն, բայց սիմվոլները նշանակում են «այս տեղում կարող է լինել 0-ից 5-ը ցանկացած թիվ»: Ահա հատուկ նիշերի ամբողջական ցանկը (php ձեռնարկում դրանք կոչվում են մետանիշեր), իսկ կանոնավոր արտահայտության մյուս բոլոր նիշերը սովորական են.

Ստորև մենք կվերլուծենք այս նիշերից յուրաքանչյուրի իմաստը (և նաև կբացատրենք, թե ինչու է «ё» տառը առանձին դրված առաջին արտահայտության մեջ), բայց առայժմ մենք կփորձենք կիրառել մեր կանոնավոր արտահայտությունները տեքստի վրա և տեսնել, թե ինչ է տեղի ունենում: PHP-ն ունի հատուկ ֆունկցիա preg_match ($regexp, $text, $match) , որն ընդունում է կանոնավոր արտահայտություն, տեքստ և դատարկ զանգված որպես մուտքագրում։ Այն ստուգում է, թե արդյոք տեքստը պարունակում է ենթատող, որը համապատասխանում է տվյալ օրինաչափությանը և վերադարձնում է 0, եթե ոչ, կամ 1, եթե այն համապատասխանում է: Իսկ անցած զանգվածում 0 ինդեքսով տարրի մեջ տեղադրվում է կանոնավոր արտահայտության հետ հայտնաբերված առաջին համընկնումը։ Եկեք գրենք մի պարզ ծրագիր, որը կիրառում է կանոնավոր արտահայտություններ տարբեր տողերի վրա.

Այժմ, երբ մենք տեսանք օրինակը, եկեք ավելի մանրամասն ուսումնասիրենք կանոնավոր արտահայտությունները:

Փակագծերը կանոնավոր արտահայտություններով

Եկեք ամփոփենք, թե ինչ են նշանակում փակագծերի տարբեր տեսակներ.

  • Գանգուր փակագծերը a(1,5) նշում են նախորդ նիշի կրկնությունների քանակը. այս օրինակում արտահայտությունը փնտրում է 1-ից 5 անընդմեջ «a» տառեր:
  • Քառակուսի փակագծերը նշանակում են «այս նիշերից որևէ մեկը», այս դեպքում՝ a, b, c, x, y, z տառերը կամ 0-ից 5-ը։ կամ * - դրանք նշանակում են կանոնավոր նիշ: Եթե ​​սկզբում քառակուսի փակագծերում կա ^ նիշ, ապա իմաստը հակառակ է․ .
  • Փակագծերում խմբավորեք նիշերը և արտահայտությունները: Օրինակ, abc+ արտահայտության մեջ գումարած նշանը վերաբերում է միայն c տառին, և այս արտահայտությունը փնտրում է այնպիսի բառեր, ինչպիսիք են abc, abcc, abccc: Իսկ եթե փակագծերը դնեք a (bc) +, ապա գումարած քանակն արդեն վերաբերում է bc հաջորդականությանը, և արտահայտությունը փնտրում է abc, abcbc, abcbcbc բառերը:

Նշում. նիշերի միջակայքերը կարելի է նշել քառակուսի փակագծերում, բայց հիշեք, որ ռուսերեն ё տառը առանձին է այբուբենից և «ցանկացած ռուսերեն տառ» գրելու համար պետք է գրել [а-яё]:

բեքսլեշի

Եթե ​​դուք դիտել եք կանոնավոր արտահայտությունների վերաբերյալ այլ ձեռնարկներ, հավանաբար նկատել եք, որ ետ կտրվածքն ամենուր տարբեր կերպ է գրված: Ինչ-որ տեղ գրում են մեկ ետ կտրվածք՝ \d , բայց այստեղ օրինակներում կրկնվում է 2 անգամ՝ \\d ։ Ինչո՞ւ։

Սովորական արտահայտությունների լեզուն պահանջում է, որ դուք մեկ անգամ գրեք հակադարձ շեղը: Այնուամենայնիվ, PHP-ում միայնակ և կրկնակի մեջբերված տողերում, հետնագիծը նույնպես հատուկ նշանակություն ունի. ձեռնարկ տողերի մասին: Դե, օրինակ, եթե գրեք $x = "\$"; այնուհետև PHP-ն այն կընդունի որպես հատուկ կոմբինացիա և կտեղադրի միայն $ նիշը տողի մեջ (և ռեգեքս շարժիչը չի իմանա դրա հետին կտրվածքի մասին): \$ հաջորդականությունը տողի մեջ տեղադրելու համար մենք պետք է կրկնապատկենք հետին կտրվածքը և ծածկագիրը գրենք որպես $x = "\\$"; .

Այդ իսկ պատճառով, որոշ դեպքերում (որտեղ նիշերի հաջորդականությունը հատուկ նշանակություն ունի PHP-ում) մեզանից պահանջվում է կրկնապատկել հակադարձ սլաքը.

  • \$ կանոնավոր արտահայտությամբ գրելու համար մենք գրում ենք «\\$» կոդով
  • \\ կանոնավոր արտահայտությամբ գրելու համար մենք կրկնապատկում ենք յուրաքանչյուր հետին կտրվածք և գրում «\\\\»:
  • Կանոնավոր արտահայտության մեջ հետշեղ և թիվ (\1) գրելու համար հետին կտրվածքը պետք է կրկնապատկվի՝ «\\1»

Այլ դեպքերում, մեկ կամ երկու հետշեղերը կտան նույն արդյունքը. «\\d»-ը և «\d»-ը կմտցնեն զույգ \d նիշեր տողի մեջ. առաջին դեպքում, 2 հակադարձ կտրվածքը հետադարձ կտրվածքի տեղադրման հաջորդականությունն է: , երկրորդ դեպքում չկա հատուկ հաջորդականություն և նիշերը կտեղադրվեն այնպես, ինչպես կա։ Դուք կարող եք ստուգել, ​​թե ինչ նիշեր կտեղադրվեն տողի մեջ և ինչ կտեսնի սովորական արտահայտությունների շարժիչը՝ օգտագործելով echo. echo «\$»; . Այո, դժվար է, բայց ի՞նչ կարող ես անել։

Հատուկ կոնստրուկցիաներ կանոնավոր արտահայտություններով

  • \d-ը փնտրում է ցանկացած մեկ նիշ, \D - ցանկացած նիշ, բացի թվանշանից
  • \w-ը համապատասխանում է ցանկացած մեկ տառի (ցանկացած այբուբենի), թվանշանի կամ ընդգծված _ . \W-ը համապատասխանում է ցանկացած նիշի, բացառությամբ տառի, թվի, ընդգծման:

Նաև կա հարմար պայման բառի սահմանը ցույց տալու համար. \b . Այս կոնստրուկցիան նշանակում է, որ դրա մի կողմում պետք է լինի տառ/թիվ/ընդգծում (\w), իսկ մյուս կողմում՝ ոչ: Դե, օրինակ, մենք ուզում ենք տեքստում գտնել «կատու» բառը։ Եթե ​​մենք գրենք կանոնավոր արտահայտությունը /cat/ui , ապա այն կգտնի այս տառերի հաջորդականությունը ցանկացած վայրում, օրինակ՝ «գազան» բառի ներսում։ Սա ակնհայտորեն այն չէ, ինչ մենք ուզում էինք: Եթե ​​կանոնավոր արտահայտությանը ավելացնենք բառի սահմանային պայման՝ /\bcat\b/ui , ապա այժմ կփնտրվի միայն «cat» առանձին բառը։

Ձեռնարկ

  • PHP-ում կանոնավոր արտահայտությունների շարահյուսություն, մանրամասն նկարագրություն
խառը preg_replace(խառը նախշ, խառը փոխարինում, խառը թեմա [, int limit])

Որոնում է թեման օրինաչափությունների համընկնումների համար և դրանք փոխարինում փոխարինողով: Եթե ​​սահմանային պարամետրը նշված է, ապա կաղապարի սահմանային դեպքերը կփոխարինվեն. եթե սահմանը բաց թողնվի կամ հավասար է -1-ի, ապա օրինաչափության բոլոր երևույթները կփոխարինվեն:

Փոխարինումը կարող է պարունակել \\ n ձևի հղումներ կամ (PHP 4.0.4-ի դրությամբ) $n, վերջինը նախընտրելի է: Յուրաքանչյուր նման հղում կփոխարինվի n-րդ փակագծով ենթապատկերին համապատասխանող ենթատողով: n-ը կարող է արժեքներ ընդունել 0-ից մինչև 99, հղումով \\0 (կամ $0) համապատասխանում է ամբողջ օրինաչափության առաջացմանը: Ենթապատկերները համարակալված են՝ ձախից աջ՝ մեկից սկսած:

Ենթապատկերի հղումների միջոցով նիշերի փոխարինում օգտագործելիս կարող է լինել այնպիսի իրավիճակ, երբ դիմակին անմիջապես հետևում է թվանշան: Այս դեպքում \\n նշումը հանգեցնում է սխալի. հղումը առաջին ենթապատկերին, որին հաջորդում է 1-ը, կգրվի որպես \\11 , որը կմեկնաբանվի որպես հղում տասնմեկերորդ ենթապատկերին: Այս թյուրիմացությունը կարելի է վերացնել՝ օգտագործելով \$(1)1 կոնստրուկցիան, որը ցույց է տալիս առաջին ենթապատկերի առանձին հղումը, որին հաջորդում է 1 թվանշանը:

Այս օրինակի արդյունքը կլինի.

Ապրիլ 1, 2003 թ

Եթե ​​ֆունկցիայի կատարման ժամանակ օրինաչափության համընկնում հայտնաբերվի, առարկայի փոփոխված արժեքը կվերադարձվի, հակառակ դեպքում՝ առարկայի բնօրինակ տեքստը կվերադարձվի:

Ֆունկցիայի առաջին երեք պարամետրերը preg_replace ()կարող են լինել միաչափ զանգվածներ: Եթե ​​զանգվածն օգտագործում է ստեղներ, ապա զանգվածը մշակելիս դրանք կվերցվեն այն հերթականությամբ, որով գտնվում են զանգվածում։ Նմուշի և փոխարինման համար զանգվածում ստեղների նշելը պարտադիր չէ: Եթե ​​դեռ որոշել եք ինդեքսներ օգտագործել, օգտագործեք ֆունկցիան՝ փոխարինման մեջ ներգրավված նախշերը և տողերը համապատասխանելու համար: ksort ()զանգվածներից յուրաքանչյուրի համար:


Օրինակ 2. Թվային ինդեքսներով զանգվածների օգտագործումը որպես ֆունկցիայի փաստարկներ preg_replace ()

$string = «Արագ շագանակագույն աղվեսը ցատկեց ծույլ շան վրայով»։;$patterns [ 0 ] = "/quick/" ;
$patterns [1] = "/շագանակագույն/" ;
$patterns [ 2 ] = "/fox/" ;$replacements [ 2 ] = " արջ " ;
$replacements [ 1 ] = "սեւ" ;
$replacements [ 0 ] = "դանդաղ" ;preg_replace ($patterns, $replacements, $string);
?>

Արդյունք:

Արդյունք:

Դանդաղ սև արջը ցատկեց ծույլ շան վրայով։

Եթե ​​առարկայի պարամետրը զանգված է, ապա դրա յուրաքանչյուր տարրի համար կատարվում է օրինաչափության որոնում և փոխարինում: Վերադարձված արդյունքը նույնպես կլինի զանգված:

Այն դեպքում, երբ պարամետրերի օրինակը և փոխարինումը զանգվածներ են, preg_replace ()հերթով հանում է զույգ տարրեր երկու զանգվածից և օգտագործում դրանք որոնման և փոխարինման գործողության համար: Եթե ​​փոխարինող զանգվածը պարունակում է ավելի շատ տարրեր, քան օրինակը, ապա փոխարինման համար բացակայող տարրերի փոխարեն կվերցվեն դատարկ տողեր: Եթե ​​նախշը զանգված է, իսկ փոխարինումը` տող, ապա նախշի յուրաքանչյուր տարր կփնտրվի և կփոխարինվի նախշով (նախշը իր հերթին կլինեն զանգվածի բոլոր տարրերը, մինչդեռ փոխարինող տողը մնում է ֆիքսված): Ընտրանքը, երբ նախշը տող է, իսկ փոխարինումը զանգված է, իմաստ չունի:

/e փոփոխիչը փոխում է ֆունկցիայի վարքագիծը preg_replace ()այնպես, որ փոխարինման պարամետրը, անհրաժեշտ փոխարինումները կատարելուց հետո, մեկնաբանվի որպես PHP կոդ և միայն այնուհետ օգտագործվի փոխարինման համար։ Այս փոփոխիչն օգտագործելիս զգույշ եղեք. փոխարինման պարամետրը պետք է պարունակի վավեր PHP կոդ, հակառակ դեպքում ֆունկցիայի կանչը պարունակող տողում preg_replace (), կառաջանա շարահյուսական սխալ։


Օրինակ 3. Փոխարինել մի քանի նախշերով

$patterns = զանգված ( "/(19|20)(\d(2))-(\d(1,2))-(\d(1,2))/",
"/^\s*((\w+))\s*=/" );
$replace = array ("\\3/\\4/\\1\\2", "$\\1 =");
echo preg_replace ($patterns, $replace, "(startDate) = 1999-5-27" );
?>

Այս օրինակը կարտադրի.

Փոխակերպում է բոլոր HTML թեգերը մեծատառերի


Օրինակ 5. HTML-ից տեքստ փոխարկիչ

// $document ելքը պետք է պարունակի HTML փաստաթուղթ:
// Պետք է հեռացնել բոլոր HTML պիտակները, javascript բաժինները,
// բացատ նիշեր. Անհրաժեշտ է նաև մի քանիսը փոխարինել
// HTML սուբյեկտները իրենց համարժեքին:
$որոնում = զանգված( ""]*?>.*?«սի», // Կտրել javaScript-ը
""<[\/\!]*?[^<>]*?>«սի» , // Շերտավորում է HTML պիտակները
""([\r\n])[\s]+"" , // Շերտավորում է բացատ նիշերը
""&(quot|#34);"i" , // Փոխարինում է HTML սուբյեկտները
""&(amp|#38);"i" ,
""&(lt|#60);"i" ,
""&(gt|#62);"i" ,
""&(nbsp|#160);"i" ,
""&(iexcl|#161);"i" ,
""&(cent|#162);"i" ,
""&(ֆունտ|#163);"i" ,
""&(պատճեն|#169);"i" ,
""(\d+);"e"); // մեկնաբանել որպես php կոդ$replace = զանգված("" ,
"" ,
"\\1" ,
"\"" ,
"&" ,
"<" ,
">" ,
" " ,
chr (161),
chr (162),
chr (163),
chr(169),
"chr(\\1)" );$text = preg_replace ($search, $replace, $document);
?>

Ցանկացած ժամանակակից ծրագրավորման լեզվով տեքստերի հետ աշխատելիս ծրագրավորողները մշտապես բախվում են մուտքագրված տվյալների համապատասխանությունը ցանկալի օրինակին ստուգելու, թեստային դրվագներ գտնելու և փոխարինելու և խորհրդանշական տեղեկատվության մշակման այլ բնորոշ գործողություններ կատարելու խնդիրներին: Սեփական ստուգման ալգորիթմների մշակումը հանգեցնում է ժամանակի կորստի, ծրագրի կոդի անհամատեղելիության և դրա մշակման և արդիականացման բարդության:

Համացանցի և WEB-ի զարգացման լեզուների արագ զարգացումը պահանջում էր տեքստի մշակման ունիվերսալ և կոմպակտ գործիքների ստեղծում՝ դրա համար պահանջվող կոդերի նվազագույն քանակով: PHP լեզուն, որը հայտնի է սկսնակների և պրոֆեսիոնալ ծրագրավորողների շրջանում, բացառություն չէ: Կանոնավոր արտահայտությունը որպես տեքստի կաղապարի լեզու թույլ է տալիս պարզեցնել տեքստի մշակման խնդիրները և կրճատել ծրագրի կոդը տասնյակ և հարյուրավոր տողերով: Շատ խնդիրներ ընդհանրապես անհնար է լուծել առանց դրա:

Կանոնավոր արտահայտություններ PHP-ում

PHP լեզուն պարունակում է կանոնավոր արտահայտությունների հետ աշխատելու երեք մեխանիզմ՝ «ereg», «mb_ereg» և «preg»: Ամենատարածվածը «preg» ինտերֆեյսն է, որի գործառույթները ապահովում են մուտք դեպի PCRE կանոնավոր արտահայտությունների աջակցության գրադարան, որն ի սկզբանե մշակվել է Perl լեզվի համար, որը միացված է PHP-ին: Preg ֆունկցիաները փնտրում են համընկնում տվյալ տեքստային տողում, ըստ կանոնավոր արտահայտությունների լեզվի որոշակի օրինաչափության:

Շարահյուսության հիմունքներ

Կարճ հոդվածի շրջանակներում անհնար է մանրամասն նկարագրել կանոնավոր արտահայտությունների ողջ շարահյուսությունը, դրա համար կա հատուկ գրականություն։ Մենք կտանք միայն հիմնական տարրերը՝ մշակողի համար լայն հնարավորությունները ցույց տալու և կոդի օրինակները հասկանալու համար։

B-ն ձևականորեն սահմանվում է շատ դժվար, և, հետևաբար, մենք կպարզեցնենք նկարագրությունը: Կանոնավոր արտահայտությունը տեքստային տող է: Այն բաղկացած է սահմանազատված օրինակից և փոփոխիչից, որը ցույց է տալիս, թե ինչպես պետք է այն մշակել: Կաղապարներում հնարավոր է ներառել տարբեր այլընտրանքներ և կրկնություններ։

Օրինակ՝ արտահայտության մեջ /\d(3)-\d(2)-\d(2)/մսահմանազատողը կլինի «/» , որին հաջորդում է նախշը և խորհրդանիշը «մ»կլինի փոփոխիչ:

Կանոնավոր արտահայտությունների ամբողջ ուժը կոդավորված է մետանիշերով: Լեզվի հիմնական մետանիշը հետնագիծն է՝ «\»: Այն հակադարձում է իրեն հաջորդող կերպարի տեսակը (այսինքն՝ սովորական կերպարը դառնում է մետանիշ և հակառակը)։ Մեկ այլ կարևոր մետանիշ է «|» շեղը, որը սահմանում է այլընտրանքային օրինաչափություններ: Մետանիշերի ավելի շատ օրինակներ.

PHP-ն, կանոնավոր արտահայտություններ մշակելիս, տարածությունը վերաբերվում է որպես առանձին նշանակալի նիշ, ուստի ABCWHERE և ABCWHERE արտահայտությունները տարբեր են:

Ենթապատկերներ

PHP-ում կանոնավոր ենթատիպերը տարբերվում են փակագծերով և երբեմն կոչվում են «ենթաարտահայտություններ»: Կատարեք հետևյալ գործառույթները.

    Այլընտրանքների ընտրություն. Օրինակ՝ կաղապար ջերմություն (որոշ|թռչուն|)համապատասխանում է բառերին «ջերմություն», «կրակե թռչուն»և «բոված». Իսկ առանց փակագծերի դա կլինի ընդամենը դատարկ լար՝ «թռչուն» ու «տաք»։

    «Հուզիչ» ենթաօրինաչափություն.Սա նշանակում է, որ եթե ենթատողը համընկնում է օրինաչափության մեջ, ապա արդյունքում բոլոր համընկնումները վերադարձվում են: Պարզության համար բերենք մի օրինակ. Հաշվի առնելով հետևյալ կանոնավոր արտահայտությունը. հաղթողը ստանում է ((ոսկի|ոսկի) (մեդալ|գավաթ)) -և համընկնումներ որոնելու համար տող. «Հաղթողը ոսկե մեդալ է ստացել».. Բացի բնօրինակ արտահայտությունից, որոնումը կհանգեցնի. «ոսկե մեդալ», «Մեդալ», «ոսկի».

Կրկնվող օպերատորներ (որակիչ)

Կանոնավոր արտահայտություններ կազմելիս շատ հաճախ անհրաժեշտ է լինում վերլուծել թվերի և նիշերի կրկնությունները։ Սա խնդիր չէ, եթե կրկնությունները շատ չեն: Բայց ի՞նչ անել, երբ մենք չգիտենք դրանց ճշգրիտ թիվը։ Այս դեպքում պետք է օգտագործվեն հատուկ մետանիշեր:

Կրկնությունները նկարագրելու համար օգտագործվում են քառակուսիչներ՝ քանակությունը սահմանելու համար մետանիշեր: Quadifiers- ը երկու տեսակի է.

  • ընդհանուր, փակագծերում;
  • կրճատված.

Ընդհանուր քանակական ցուցանիշը սահմանում է տարրի թույլատրելի կրկնությունների նվազագույն և առավելագույն թիվը՝ որպես երկու թվեր գանգուր փակագծերում, այսպես՝ x(2.5): Եթե ​​կրկնությունների առավելագույն քանակը անհայտ է, ապա երկրորդ արգումենտը բաց է թողնվում՝ x(2,):

Կրճատված քանակականները խորհրդանիշներ են ամենատարածված կրկնությունների համար՝ շարահյուսությունը ծանրաբեռնելուց խուսափելու համար: Սովորաբար օգտագործվում են երեք հապավումներ.

1. * - զրո կամ ավելի կրկնություններ, որոնք համարժեք են (0,):

2. + - մեկ կամ մի քանի կրկնություն, այսինքն.):

3.? - զրո կամ միայն մեկ կրկնություն - (0.1):

Կանոնավոր արտահայտությունների օրինակներ

Նրանց համար, ովքեր սովորում են կանոնավոր արտահայտություններ, օրինակները լավագույն ձեռնարկն են: Ահա մի քանիսը, որոնք ցույց են տալիս իրենց մեծ ներուժը նվազագույն ջանքերով: Ծրագրավորման բոլոր կոդերը լիովին համատեղելի են PHP 4.x և ավելի բարձր տարբերակների հետ: Շարահյուսությունը լիարժեք հասկանալու և լեզվի բոլոր հատկանիշներն օգտագործելու համար խորհուրդ ենք տալիս J. Friedl-ի Regular Expressions գիրքը, որտեղ շարահյուսությունն ամբողջությամբ լուսաբանված է և կան կանոնավոր արտահայտությունների օրինակներ ոչ միայն PHP-ում, այլ նաև Python-ի համար, Perl, MySQL, Java, Ruby և C#:

Էլեկտրոնային փոստի հասցեի ճշգրտության ստուգում

Առաջադրանք.Կա մի վեբ էջ, որը այցելուից էլփոստի հասցե է խնդրում: Հաղորդագրություններն ուղարկելուց առաջ կանոնավոր արտահայտությունը պետք է ստուգի՝ արդյոք ստացված հասցեն ճիշտ է: Չեկը չի երաշխավորում, որ նշված փոստարկղն իսկապես գոյություն ունի և ընդունում է նամակներ: Բայց նա կարող է ջնջել միտումնավոր սխալ հասցեները:

Լուծում.Ինչպես ցանկացած ծրագրավորման լեզվով, էլփոստի հասցեի վավերացման կանոնավոր արտահայտությունները կարող են իրականացվել PHP-ում տարբեր ձևերով, և այս հոդվածի օրինակները նախատեսված չեն լինել վերջնական և միակ տարբերակը: Հետևաբար, յուրաքանչյուր դեպքում մենք կտրամադրենք պահանջների ցանկ, որոնք պետք է հաշվի առնել ծրագրավորման ժամանակ, և կոնկրետ իրականացումը լիովին կախված է մշակողից:

Այսպիսով, արտահայտությունը, որը ստուգում է էլփոստի վավերականությունը, պետք է ստուգի հետևյալ պայմանները.

  1. Աղբյուրի տողում @ նշանի առկայությունը և բացատների բացակայությունը։
  2. Հասցեի տիրույթի մասը, @ խորհրդանիշից հետո, պարունակում է միայն վավեր նիշեր տիրույթի անունների համար: Նույնը վերաբերում է օգտանունին:
  3. Օգտվողի անունը վավերացնելիս անհրաժեշտ է հայտնաբերել հատուկ նիշերի առկայությունը, ինչպիսիք են ապաստրոֆը կամ նման նիշերը պոտենցիալ վտանգավոր են և կարող են պարունակվել այնպիսի հարձակումներում, ինչպիսիք են SQL ներարկումները: Խուսափեք նման հասցեներից։
  4. Օգտվողի անունները թույլ են տալիս միայն մեկ կետ, որը չի կարող լինել տողի առաջին կամ վերջին նիշը:
  5. Դոմենի անունը պետք է պարունակի առնվազն երկու և ոչ ավելի, քան վեց նիշ:

Օրինակ, որը հաշվի է առնում այս բոլոր պայմանները, կարելի է տեսնել ստորև բերված նկարում:

Վավերացնել URL-ները

Առաջադրանք.Ստուգեք, արդյոք տվյալ տեքստային տողը վավեր է Կրկին, URL վավերացման կանոնավոր արտահայտությունները կարող են իրականացվել տարբեր ձևերով:

Լուծում.Մեր վերջնական տարբերակը այսպիսի տեսք ունի.

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

Այժմ եկեք ավելի մանրամասն վերլուծենք դրա բաղադրիչները՝ օգտագործելով նկարը։

Վարկային քարտերի համարների ստուգում

Առաջադրանք.Անհրաժեշտ է իրականացնել ամենատարածված վճարային համակարգերի մուտքագրված պլաստիկ քարտի համարի ճշգրտության ստուգում: Դիտարկված է միայն քարտեզի տարբերակը

Լուծում.Արտահայտություն ստեղծելիս անհրաժեշտ է հաշվի առնել մուտքագրված թվի մեջ բացատների հնարավոր առկայությունը։ Քարտի համարի թվանշանները բաժանվում են խմբերի՝ ավելի հեշտ կարդալու և թելադրելու համար։ Հետևաբար, բնական է, որ անձը կարող է փորձել թվեր մուտքագրել այս ձևով (այսինքն՝ օգտագործելով բացատները):

Ընդհանուր արտահայտություն գրելը, որը հաշվի է առնում հնարավոր տարածությունները և գծիկները, ավելի դժվար է, քան պարզապես բոլոր նիշերը, բացի թվերից, հեռացնելը: Հետևաբար, արտահայտության մեջ խորհուրդ է տրվում օգտագործել /D մետանիշը, որը հեռացնում է բոլոր նիշերը, բացի թվանշաններից։

Այժմ դուք կարող եք ուղղակիորեն գնալ համարը ստուգելու համար: Բոլոր վարկային քարտերի ընկերությունները օգտագործում են եզակի թվային ձևաչափ: Օրինակը օգտագործում է սա, և հաճախորդը կարիք չունի մուտքագրելու ընկերության անվանումը. այն որոշվում է թվով: Visa քարտերը միշտ սկսվում են 4-ով և ունեն 13 կամ 16 նիշ: MasterCard-ը սկսվում է 51-55 միջակայքում՝ 16 թվի երկարությամբ: Արդյունքում մենք ստանում ենք հետևյալ արտահայտությունը.

Պատվերը մշակելուց առաջ կարող եք լրացուցիչ ստուգել համարի վերջին թվանշանը, որը հաշվարկվում է Luhn ալգորիթմի միջոցով։

Հեռախոսահամարների ստուգում

Առաջադրանք.Մուտքագրված հեռախոսահամարի ճշգրտության ստուգում:

Լուծում.Ֆիքսված և բջջային հեռախոսահամարներում թվանշանների թիվը զգալիորեն տարբերվում է երկրից երկիր, ուստի հնարավոր չէ համընդհանուր վավերացնել հեռախոսահամարը՝ օգտագործելով կանոնավոր արտահայտություններ: Սակայն միջազգային թվերն ունեն խիստ ձևաչափ և հիանալի են օրինակները ստուգելու համար: Ավելին, ավելի ու ավելի շատ ազգային հեռախոսային օպերատորներ փորձում են համապատասխանել մեկ ստանդարտին: Թվի կառուցվածքը հետևյալն է.

+CCC.NNNNNNNNNNxEEEE,որտեղ:

C-ն 1-3 նիշանոց երկրի կոդը է:

N - թիվը մինչև 14 նիշ:

E-ն ընտրովի ընդլայնում է:

Պլյուս նշանը պարտադիր տարր է, իսկ x նշանը առկա է միայն այն դեպքում, երբ անհրաժեշտ է ընդլայնում:

Արդյունքում մենք ունենք հետևյալ արտահայտությունը.

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

Թվերը տիրույթում

Առաջադրանք.Անհրաժեշտ է ապահովել, որ որոշակի միջակայքից ամբողջ թիվը համընկնի: Բացի այդ, անհրաժեշտ է, որ կանոնավոր արտահայտությունները գտնեն միայն թվեր մի շարք արժեքներից:

Լուծում. Ահա մի քանի արտահայտություններ ամենատարածված դեպքերից մի քանիսի համար.

IP հասցեի որոնում

Առաջադրանք.Դուք պետք է որոշեք, թե արդյոք տվյալ տողը վավեր IP հասցե է IPv4 ձևաչափով 000.000.000.000-255.255.255.255 միջակայքում:

Լուծում.Ինչպես ցանկացած PHP առաջադրանքի դեպքում, կանոնավոր արտահայտությունն ունի բազմաթիվ տատանումներ: Օրինակ՝ սա.

Արտահայտությունների առցանց ստուգում

Սովորական արտահայտությունների ճշգրտության ստուգումը կարող է դժվար լինել սկսնակ ծրագրավորողների համար շարահյուսության բարդության պատճառով, որը տարբերվում է «սովորական» ծրագրավորման լեզուներից: Այս խնդիրը լուծելու համար կան բազմաթիվ առցանց արտահայտությունների փորձարկիչներ, որոնք հեշտացնում են իրական տեքստի վրա ստեղծված կաղապարի ճիշտությունը ստուգելը։ Ծրագրավորողը ստուգման համար մուտքագրում է արտահայտություն և տվյալներ և ակնթարթորեն տեսնում է մշակման արդյունքը: Սովորաբար կա նաև հղումների բաժին, որը մանրամասն նկարագրում է կանոնավոր արտահայտություններ, օրինակներ և իրականացման տարբերություններ ամենատարածված ծրագրավորման լեզուների համար:

Սակայն առցանց ծառայությունների արդյունքներին լիովին վստահելը խորհուրդ չի տրվում PHP օգտագործող բոլոր մշակողների համար: Գրված և անձամբ փորձարկված սովորական արտահայտությունը բարելավում է հմտությունները և երաշխավորում, որ սխալներ չկան: