PHP (muntazam ifoda) - bu nima?  Muntazam iboralarga misollar va sinash.  PHP regexp: muntazam ifodalarga misollar Php muntazam ifodalar daraja belgilari

PHP (muntazam ifoda) - bu nima? Muntazam iboralarga misollar va sinash. PHP regexp: muntazam ifodalarga misollar Php muntazam ifodalar daraja belgilari

Ushbu maqola PHP regexp misollari tanlovini taqdim etadi. Muntazam ifoda misollarining juda yaxshi va foydali to'plami. Barcha muntazam ifoda misollari PHP uchun qabul qilinadi. Sog'ligingiz uchun zavqlaning!

Domen nomini tekshirish misoli

Ushbu PHP parchasi satrning to'g'ri domen nomi yoki yo'qligini tekshiradi.

?:.*)+):?(d+)?/?/i, $url)) ( echo "Sizning urlingiz yaxshi."; ) else ( "Noto'g'ri url."; ) echo

Matndagi so'zni ajratib ko'rsatishga misol

Matndagi kerakli so'zni qidirish va ta'kidlash uchun juda foydali muntazam ibora. Kod ayniqsa qidiruv natijalarini yaratishda foydalidir.

$text = "KomunitasWeb dan namunaviy jumla, regex veb-dasturlashda mashhur bo'ldi. Endi biz regexni o'rganamiz. Vikipediyaga ko'ra, Regular iboralar (regex yoki regexp sifatida qisqartirilgan, ko'plik shakllari regexs, regexps yoki regexen) rasmiy shaklda yoziladi. muntazam ifoda protsessori tomonidan talqin qilinadigan til”; $matn = preg_replace("/b(regex)b/i", " 1", $matn); echo $matn;

Qidiruv natijalarini ta'kidlashni amalga oshirishga misolWordPress

Search.php faylini oching va the_title() funksiyasini toping. Uni quyidagi qator bilan almashtiring:

Echo $title;

Endi, almashtirilgan qatordan oldin ushbu kodni kiriting:

\0", $title); ?>

Search.php faylingizni saqlang va style.css faylini oching. Unga quyidagi qatorni qo'shing:

Strong.search-parcha (fon: sariq; )

dan tasvirlarni olishga misolHTML regexp usuli

Muntazam iboralar yordamida PHP kodining ushbu qismi barcha tasvirlar va ularning URL manzillarini qidiradi.

$tasvirlar = massiv(); preg_match_all("/(img|src)=("|")[^"">]+/i", $ma'lumotlar, $media); sozlanmagan ($ma'lumotlar); $data=preg_replace("/(img|src)("|"|="|=")(.*)/i","$3",$media); foreach($ma'lumotlar $url sifatida) ( $info = pathinfo($url); if (isset($info["kengaytma"])) ( if (($info["kengaytma"] == "jpg") || ($info["kengaytma"] == "jpeg") || ($info["kengaytma"] == "gif") || ($info["kengaytma"] == "png")) array_push($ rasmlar, $url); ) )

Takroriy so'zlarni o'chirish (katta harflar hisobga olinmaydi)

Tez-tez takrorlanadigan so'zlar bormi? Keyin ushbu oddiy ifoda misoli siz uchun foydali bo'ladi.

$matn = preg_replace("/s(w+s)1/i", "$1", $matn);

Ikki nusxadagi nuqtalarni olib tashlash

Xuddi shu narsa, faqat takrorlanadigan nuqtalar bilan.

$matn = preg_replace("/.+/i", ".", $matn);

XML/HTML teglarini moslashtirish

Ushbu oddiy funktsiya ikkita argumentni oladi: teg (siz mos kelmoqchi bo'lgan), xml yoki html kodi.

funksiya get_tag($tag, $xml) ( $tag = preg_quote($tag); preg_match_all("(<".$tag."[^>]*>(.*?).")", $xml, $mos, PREG_PATTERN_ORDER); $ mosligini qaytarish; )

Muayyan atribut qiymatlari bilan XHTML/XML teglarini qidiring

Ushbu misol oldingi funktsiyaga o'xshaydi, faqat siz qidiruvni sezilarli darajada kengaytirishingiz mumkin, masalan, topish

.

Funktsiya get_tag($attr, $value, $xml, $tag=null) ( if(is_null($tag)) $tag = "\w+"; else $tag = preg_quote($tag); $attr = preg_quote($) attr); $value = preg_quote($value); $tag_regex = "/<(".$tag.")[^>]*$attr\s*=\s*". "(["\"])$qiymat\\2[^>]*>(.*?)<\/\\1>/" preg_match_all($tag_regex, $xml, $matches, PREG_PATTERN_ORDER); return $match; )

O'n oltilik rang qiymatlarini topish

Berilgan satrlardagi o'n oltilik rang qiymatlariga mos keladigan muntazam ifodaning ajoyib namunasi. Bu nima uchun? Ehtimol, siz CSS kodini siqish xizmatini yoki shunga o'xshash narsalarni yozmoqchisiz.

$string = "#555555"; if (preg_match("/^#(?:(?:(3))(1,2))$/i", $string)) ( echo "misol 6 muvaffaqiyatli."; )

Qidiruv misoliberilgan sahifadagi sarlavha

Regexp bilan PHP kodining ushbu qiziqarli namunasi teglar orasidagi matnni topadi va qaytaradi Va.

Feof($fp))( $page .= fgets($fp, 4096); ) $titre = eregi(" (.*)",$page,$regs); echo $regs; fclose($fp);

Apache jurnalini tahlil qilish

Aksariyat saytlar taniqli Apache serverlarida ishlaydi. Agar sizning saytingiz ham unda ishlayotgan bo'lsa, php regexp yordamida server jurnalini tahlil qilishingiz mumkin.

//Jurnallar: Apache veb-serveri //Faqat HTML-fayllarga muvaffaqiyatli xitlar. Sahifani ko'rishlar sonini hisoblash uchun foydalidir. "^((?#mijoz IP yoki domen nomi)S+)s+((?#asosiy autentifikatsiya)S+s+S+)s+[((?#sana va vaqt)[^]]+)]s+"(?: GET|POST|HEAD) ((?#file)/[^ ?]+?.html?)??((?#parameters)[^ ?]+)? HTTP/+"s+(?#status kodi)200s+((?#bayt uzatildi)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agenti) )[^"]*)"$" //Jurnallar: Apache veb-server //Faqat 404 xatolik "^((?#mijoz IP yoki domen nomi)S+)s+((?#basic autentifikatsiya)S+s+S+) s+[((?#sana va vaqt)[^]]+)]s+"(?:GET|POST|HEAD) ((?#fayl)[^ ?"]+)??((?#parameters)[ ^?"]+)? HTTP/+"s+(?#status kodi)404s+((?#bayt o'tkazildi)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agenti) )[^"]*)"$"

Parol murakkabligini tekshirishga misol

Parolning murakkablik darajasini tekshiradigan muntazam ifodaning ajoyib namunasi. Parol 6 ta belgidan iborat bo'lishi va kamida bitta katta harf, kichik harf va raqamdan iborat bo'lishi kerak.

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

Matn kulgichlarini grafik kulgichlar bilan almashtirish

Ushbu misol kodi matn emotsiyasini grafik belgisiga o'zgartiradi. Qiziqarli va foydali PHP parchasi.

$texte="Smaylili matn:-)"; echo str_replace(":-)"," ",$ text);

Rasmlarni olish uchun oddiy iboraga misolhtml kodi

Aytish joizki, ushbu PHP kodi wordpressda tasvirlarni qidirish va qayta ishlash uchun ishlatiladi.

post_content; $szSearchPattern = "~ ]* />~"; // Barcha rasmlarni olish va natijalarni $aPics preg_match_all($szSearchPattern, $szPostContent, $aPics) da saqlash uchun preg_match_all-ni ishga tushiring; // Bizda kamida 1 ta rasm borligini tekshiring $iNumberOfPics = count($aPics); if ($iNumberOfPics > 0) ( // Bu yerda siz rasmlaringizni qayta ishlashingiz mumkin // Bu misolda ular shunchaki monitorda ($i=0; $i) ko‘rsatiladi.< $iNumberOfPics ; $i++) { echo $aPics[$i]; }; }; endwhile; endif; ?>

Umid qilamanki, siz ushbu PHP regexp misollar to'plamini foydali deb topdingiz. Agar qiziqarli qo'shimchalar yoki oddiy iboralar (php) misollari bo'lsa, izohlarda yozing.

Oddiy ifodalar (regex sifatida qisqartiriladi) qidiruv naqshlarini tashkil etuvchi belgilar ketma-ketligidir. Ular birinchi navbatda simlarni moslashtirish naqshlarida qo'llaniladi.

Qisqa hikoya

  • Hammasi 1940-1960-yillarda, ko'plab aqlli odamlar muntazam iboralar haqida gapirganda boshlangan;
  • 1970-yillar g/re/p;
  • 1980 yil Perl va Genri Spenser;
  • 1997 PCRE (Perl bilan mos keladigan muntazam ifodalar). Biz muntazam iboralar deb ataydigan iboralarning yuksalishi aynan shu paytdan boshlangan. PCRE deyarli har bir til uchun kutubxonalarni taqdim etadi.

PHPda muntazam ifodalardan umumiy foydalanish

PHP PCRE bilan ishlash uchun uchta asosiy funktsiyani o'z ichiga oladi - preg_match, preg_match_all va preg_replace.

Muvofiqlikni taqqoslash

Ifoda mos kelsa, 1, mos kelmasa 0, xatolik yuzaga kelsa, false qaytaradi:

int preg_match (string $pattern, string $subject [, massiv va$mavzular [, int $flags = 0 [, int $offset = 0 ]]])

Topilgan mosliklar sonini qaytaruvchi muntazam ifodaga misol:

int preg_match_all (string $pattern, string $mavzu [, massiv va$ mos keladi [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]])

O'zgartirish

Ifoda almashtirilgan satr yoki massivni qaytaradi ( $mavzuga asoslangan):

aralash preg_replace (aralash $naqsh, aralash $almashtirish, aralash $mavzu [, int $chegarasi = -1 [, int $count ]])

JavaScript-da oddiy iboralardan umumiy foydalanish

JavaScript-dagi oddiy iboralar PHP-dagi kabi deyarli bir xil ko'rinadi.

Muvofiqlikni taqqoslash

Mosliklar qatorini qaytaradi yoki moslik topilmasa null:

string.match(RegExp);

O'zgartirish

O'zgartirishlar kiritilgan satrni qaytaradigan muntazam ifoda:

string.replace(RegExp, almashtirish);

JavaScript-da muntazam ifodalarning xususiyatlari

  • Nuqta hech qachon yangi qatorga mos kelmaydi:
  • Muntazam ifoda orqali moslik va almashtirishni solishtirish usullari ularsiz ham xuddi shunday.

Muntazam ifoda qoliplarini tuzish tamoyillari

Keling, kod bazasida elektron pochta manzillarini topishimiz kerak bo'lgan misolni ko'rib chiqaylik. Bizning maqsadimiz:

Analog rozetkalar

Oddiy iboralar ikki turdagi belgilardan iborat:

  • Maxsus belgilar: ? * + () () ^ $ / .
  • Harflar.

Kirish satrlarini murvat sifatida, shablonni esa ular uchun ulagichlar to'plami sifatida (tegishli tartibda) tasavvur qiling.

Maxsus belgilar

Muntazam iboralarni sinab ko'rishda siz maxsus belgilar qanday ishlashini bilishingiz kerak:

  • Teskari qiyshiq chiziq \ belgisi boshqa maxsus belgini muntazam ifodada almashtirishi mumkin:
  • Nuqta va w -.

Yangi qatorlardan tashqari barcha belgilarni moslang. Agar siz nuqta va faqat nuqta bilan muvofiqligini tekshirmoqchi bo'lsangiz - , harflar, raqamlar va pastki chiziq bilan muvofiqligini - w

  • Kvadrat qavslar.

Qavslar ichidagi belgilarni moslang. Diapazonlarni qo'llab-quvvatlaydi. Ba'zi misollar:
o - har qanday a, b yoki c mos keladi.
o bosh harflar.
o har qanday raqam.
o - Har qanday kichik yoki katta harflar alfavit belgilariga mos keladi.
Ixtiyoriymi? 0 yoki 1-ga mos keling.
Yulduzcha *.

Yulduzcha 0 yoki undan ortiq belgilarni bildiradi.

1 yoki undan ortiq belgilarni moslang.

Jingalak qavslar ().

Minimal va maksimal qiymatlar. Muntazam ifoda sintaksisiga ba'zi misollar:
o (1,) 1 dan kam emas.
o (1,3) 1 dan 3 gacha.
o (1,64) 1 dan 64 gacha.

Elektron pochta manzillari uchun muntazam ifoda olish uchun bularning barchasini qo'shamiz:

/+@+(.+)*/i


Bu PHP da shunday ko'rinadi:

preg_match_all("/+@+(.+)*/i", $input_lines, $output_array);

Tasdiqlash uchun oddiy ifodadan foydalanish

Qiyinchilik: Kirish ma'lumotlari biz kutgan narsa ekanligiga ishonch hosil qiling. Maqsad 1: /[^w$.]/ 2-maqsad: /^(1,2)$/

Oddiy iboralar elementlarni topish uchun juda mos keladi, lekin siz aynan nimani qidirayotganingizni bilishingiz kerak.

Qachon tekshirish uchun muntazam ifodani ishlatmaslik kerak?

Ko'p holatlar PHP filter_var funksiyasi yordamida yaxshiroq ko'rib chiqiladi. Masalan, elektron pochta manzilini tekshirish PHP-ning o'rnatilgan filtrlari yordamida amalga oshirilishi kerak:

filter_var(" [elektron pochta himoyalangan]", FILTER_VALIDATE_EMAIL)

Oddiy iboralar yordamida tekshirish

Satr oxiridagi oddiy iboralar langarlardan foydalanadi:

^ - qator boshini bildiradi.
$ - qatorning oxirini ko'rsatadigan dollar belgisi.

agar (!preg_match("%^(1,2)$%", $_POST["obuna_chastotasi"])) ( $isError = rost; )

Cheklangan belgilar sinflari

[^abc] - a, b yoki c tashqari hamma narsa, shu jumladan yangi qatorlar.

Faqat harf-raqamli belgilar, tire, nuqta va pastki chiziqni kiritish imkonini beruvchi misol:

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

Qidiring va almashtiring

Topish va almashtirishni amalga oshirish uchun eng keng tarqalgan PCRE funktsiyalari preg_replace() va preg_replace_callback() dir. Ammo deyarli bir xil ishlarni bajaradigan preg_filter() va preg_replace_callback_array() ham mavjud. Esda tutingki, preg_replace_callback_array() funksiyasi PHP7-dan beri mavjud.

Ro'yxatdagi so'zlarni almashtiring

$subject = "Men olma iste'mol qilmoqchiman."; echo preg_replace("/olma|banana|apelsin/", "meva", $mavzu);

Natija

Men meva iste'mol qilmoqchiman.

Agar oddiy iboraning pastki naqshlari bo'lsa ( qavs ichida), siz $N yoki N (qaerda N butun son >= 1), bu "backlink" deb ataladi.

Ikki raqamni qayta tartiblash

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

Natija

Sana formatini o'zgartirish

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

Natija

Tegdagi URL manzilini almashtirishning oddiy misoli

$subject = "Qo'shimcha maqolalar uchun https://php.earth/doc saytiga tashrif buyuring."; echo preg_replace("#(https?://([^s./]+(?:.[^s./]+)*[^s]*))#i", "$2", $subject) ;

Natija

Boshqa maqolalar uchun php.earth/doc saytiga tashrif buyuring.

Ba'zan siz murakkab qidiruv va almashtirishni amalga oshirishingiz kerak, masalan, almashtirishdan oldin filtrlash/tekshirish. Bunday vaziyatda Preg_replace_callback() yordam berishi mumkin.

Oldingi misoldagi oddiy ifoda faqat http yoki https bilan boshlanadigan URL manzillarini almashtirishi mumkin. Lekin endi biz www bilan boshlanadigan URL manzillarini ham almashtirishimiz kerak. Kimdir https-ni o'zgartirishi mumkin deb o'ylaydimi? : // pastki shablonda. Masalan, ( ?: Https? : // | www.), Lekin bu ko'pchilik brauzerlarda ishlamaydi, chunki ular www.domainni nisbiy yo'l sifatida izohlaydilar.

Shunday qilib, Regular Expression Builder dasturida almashtirishdan oldin ba'zi ishlarni bajarishingiz kerak, agar URL www bilan boshlangan bo'lsa, http:// qo'shing.

funktsiya add_protocol_if_begins_with_www($matches) ( $url = strtolower($matches) === "www." ? "http://" . $matches: $matches; return "($matches)"; ) $subject = "Iltimos Qo'shimcha maqolalar uchun www.php.earth/doc saytiga tashrif buyuring."; echo preg_replace_callback("#(https?://|www.)([^s./]+(?>.[^s./]+)*[^s]*)#i", "agar_www_bilan_boshlansa_protokol_qo'shish", $mavzu);

Natija


PHP tilining juda kuchli va foydali xususiyatlaridan biri uning muntazam ifodalarni qo'llab-quvvatlashidir. Ko'pgina dasturchilar, ham yangi boshlanuvchilar, ham juda tajribalilar, muntazam ifoda tilining aniq murakkabligi va murakkabligidan qo'rqishadi. Lekin sizni ishontirib aytamanki, bunga arziydi. Muntazam iboralardan foydalanish matnlarni va zaif tuzilgan ma'lumotlarni qayta ishlash ishini sezilarli darajada osonlashtiradi.


Muntazam iboralar maxsus tilda yozilgan iboralardir. Xavotir olmang, tilni tushunish juda oson, sizga faqat tajriba va amaliyot kerak.


O'ylaymanki, sizda matn mavjud bo'lganda (masalan, Microsoft Word-da) va siz undan muhim narsani topishingiz kerak bo'lgan holatlarga bir necha bor duch kelgansiz. Agar siz aniq nimani qidirayotganingizni bilsangiz, hamma narsa oddiy: qidiruv dialogiga qo'ng'iroq qiling, qidiruv so'zini kiriting, tugmani bosing va voila - matn topildi.


Agar siz qidirayotgan ma'lumot turini oldindan bilsangiz nima qilasiz? Masalan, siz bir necha yuz varaqdan iborat hujjatdagi barcha elektron pochta manzillarini topish vazifasiga duch kelasiz. Ba'zilar hujjatni qo'lda ko'radi, ba'zilari qidiruvga itni (@) kiritadi va uni qidiradi. Qabul qilaman - ikkala variant ham g'alati, rahmatsiz ish.

Bu erda muntazam iboralar yordamga keladi. Ba'zi bir taxminlarga ko'ra, muntazam iboralarni matn ustiga qo'yilgan niqoblar yoki shablonlarga solishtirish mumkin: agar matn niqobga mos kelsa, bu kerakli bo'lakdir. Ammo muntazam iboralarning qo'llanilishini ko'rib chiqishdan oldin, biz ularning sintaksisi bilan tanishamiz.

Muntazam ibora ma'lum qonun va qoidalarga muvofiq tuzilgan matn qatoridir. Satr belgilar va belgilar guruhlari, metabelgilar, kvantifikatorlar va modifikatorlardan iborat.

Bunday holda, belgilar har qanday alifboning har qanday belgilarini anglatadi. Va nafaqat o'qilishi mumkin. Ifodaga o'qilmaydigan belgini osongina kiritishingiz mumkin, buning uchun uning kodini o'n oltilik shaklda bilish kifoya. Masalan:

// o'qiladigan belgilar a E // o'qilmaydigan belgilar va kodlar \x41 - "A" harfi bilan bir xil \x09 - yorliq belgisi

Belgilar guruhi ketma-ket yozilgan bir nechta belgilar:

Oʻrtacha ACZms

Men sizning e'tiboringizni darhol qaratmoqchiman - muntazam iboralardagi "bo'shliq" ham muhim belgi hisoblanadi, shuning uchun iboralarni yozishda ehtiyot bo'ling. Misol uchun, bu belgilar guruhlari TURLI iboralardir:

ABC WHERE ABC WHERE

Tilning keyingi elementi meta-belgilardir. "Meta" prefiksi bu belgilar boshqa belgilar yoki ularning guruhlarini tavsiflashini bildiradi. Jadvalda muntazam ifoda tilining asosiy meta-belgilari tasvirlangan:

Maxsus belgilarni belgilash uchun meta-belgilar
() Qavslar. Ichki iboralarni belgilaydi.
| Tanlash meta-belgi
^ Satr metabelgisining boshlanishi
$ Qator oxiri metabelgisi
\n Satr tasmasi belgisi (oltilik kod 0x0A)
\r Karetaning qaytish belgisi (oltilik kod 0x0D)
\t Tab belgisi (oltilik kod 0x09)
\xhh 0xhh oʻn oltilik kodli belgi kiritilsa, masalan \x42 lotincha “B” harfini kiritadi.
Belgilar guruhlarini belgilash uchun meta-belgilar
. Nuqta. Har qanday xarakter.
\d Raqam (0-9)
\D Raqam emas (0-9 belgilardan tashqari har qanday belgi)
\s Bo'sh belgi (odatda bo'sh joy va yorliq)
\S Boʻsh boʻlmagan belgi (barchasi \s meta-belgisi bilan belgilangan belgilardan tashqari)
\w "Lug'at" belgisi (so'zlarda ishlatiladigan belgi. Odatda barcha harflar, barcha raqamlar va pastki chiziq ("_"))
\V \w meta-belgi bilan belgilangan belgilardan tashqari hammasi

Jadvalning ikkinchi yarmidagi metabelgilarni eslab qolish juda oson. "d" - raqam (raqam), "s" - belgi (belgi), "w" - so'z (so'z). Agar harf katta bo'lsa, guruh tavsifiga "YO'Q" ni qo'shishingiz kerak.

Masalan, "Qizil formada 1812, yashil formada esa 2009 raqamlari bor" matnini olaylik. Keling, eng oddiy oddiy iboralarga misollarni ko'rib chiqaylik:

\d\d\d\d - 1812 va 2009 raqamlarini topadi \D - barcha harflar, bo'shliqlar va tinish belgilari \s - matndagi barcha bo'shliqlarni topadi.

Ammo bizning misolimizdagi yilni to'rtta emas, balki ikki raqam bilan yozish mumkin, so'zlarda boshqa tuslanishlar bo'lishi mumkin va hokazo. Kvadrat qavslar yordamida ko'rsatilgan belgilarning kichik to'plamlari bu erda yordam berishi mumkin:

Har qanday raqamni bildiradi (\d bilan bir xil) - juft raqamni bildiradi - lotin alifbosining istalgan belgisini (har qanday holatda) yoki raqamni bildiradi.

Misol uchun, test satridagi \d\d\d ifodasi faqat 1812 ni topadi, lekin 2009 emas. Bu ibora "oxirgi soni 0,2,4,6 bo'lgan to'rtta raqamning barcha ketma-ketligini toping yoki" deb o'qilishi kerak. 8".

Bizda faqat miqdor va o'zgartiruvchilarni eslatib o'tish kerak.

Miqdor ko'rsatkichi belgi yoki belgilar guruhi necha marta paydo bo'lishi kerakligini aniqlaydigan maxsus konstruktsiyadir. Miqdor ko'rsatkichi "()" jingalak qavs ichida yoziladi. Ikki yozish formati mumkin: aniq va diapazon. Aniq formati quyidagicha yozilgan:

Bu erda X - oldingi belgi yoki guruh necha marta takrorlanishi kerak. Masalan, ifoda

Yozib olishning ikkinchi shakli diapazondir. sifatida qayd etilgan

(X, Y) // yoki (,Y) // yoki (X,)

bu erda X - minimal va Y - maksimal takrorlash soni. Masalan:

"ketma-ket yozilgan ikki-to'rtta raqam" deb o'qing. Agar chegaralardan biri belgilanmagan bo'lsa, unda hech qanday cheklov qabul qilinmaydi. Masalan:

\w(3,) - uch yoki undan ortiq harf. \d(,5) - umuman raqamlar yo'q yoki bor, lekin beshdan ortiq emas.

Miqdor ko'rsatkichlari bitta belgi yoki guruhga nisbatan qo'llanilishi mumkin:

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

Ushbu qurilish matndan bir, ikki yoki uchta harfdan iborat barcha ruscha so'zlarni tanlaydi (masalan, "yoki", "yo'q", "men", "men boraman" va boshqalar).

Jingalak qavslarga qo'shimcha ravishda yana uchta kvantlovchi metabelgi mavjud: "*" (yulduzcha), "+" (ortiqcha) va "?" (savol). Ular talab qilinadigan takrorlashlarning minimal va maksimal soni oldindan noma'lum bo'lgan hollarda qo'llaniladi. Misol uchun, elektron pochta manzillarini qidirishda foydalanuvchi nomida nechta belgi ("it" dan oldin) va domen nomida ("it" dan keyin) qancha belgilar bo'lishini oldindan aytib bo'lmaydi.

"*" meta-belgisi "noldan yoki undan ortiq har qanday miqdor" deb o'qiladi, ya'ni. dizayn

ketma-ket harflarning istalgan sonini, shu jumladan ularning to'liq yo'qligini belgilaydi.

"+" belgisi yulduzchadan faqat kamida bitta belgi kerakligi bilan farq qiladi. Bular. dizayn

bir yoki bir nechta raqam bilan har qanday raqamli ketma-ketlikka mos keladi.

Belgisi "?" bitta belgining yo'qligi yoki mavjudligiga mos keladi. Bular. dizayn

bir yoki ikkita raqam bilan har qanday raqamli ketma-ketlikka mos keladi.

Bu erda "*" va "+" antiifikatorlarining bunday xususiyatini eslatib o'tish kerak ochko'zlik. Gap shundaki, sukut bo'yicha bu belgilar mumkin bo'lgan eng uzun belgilar ketma-ketligiga mos keladi. Masalan, "onam ramkani yuvdi" qatori uchun ibora:

"mama soap ra" ni tanlaydi, bu biroz kutilmagan, chunki biz "ma" ni olishni kutgandik. Ushbu xatti-harakatni o'zgartirish uchun "?" metabelgisidan foydalaning. (so'roq belgisi) miqdor ko'rsatkichidan keyin darhol yoziladi. Bu miqdor belgilovchilarning "ishtahasini" cheklaydi, ularni eng uzun emas, balki birinchi o'yinni qaytarishga majbur qiladi. Endi oldingi misolni o'zgartiramiz:

va kerakli o'yinni oling "ma".

Tilning oxirgi elementi modifikatorlar. Modifikator - bu muntazam ifodalarni tahlil qilish uchun "tizim" parametrlarini belgilaydigan maxsus belgi. Faqat to'rtta bunday belgilar mavjud, ular alohida yoki bir vaqtning o'zida ishlatilishi mumkin:

i Katta-kichik harflarni sezmaydigan rejimni yoqadi, ya'ni. ifodadagi bosh va kichik harflar farq qilmaydi.
m Qidirilayotgan matnni bir nechta satrlardan iborat deb hisoblash kerakligini bildiradi. Odatiy bo'lib, oddiy ifoda mexanizmi matnni aslida nima bo'lishidan qat'i nazar, bitta satr sifatida ko'radi. Shunga ko'ra, "^" va "$" meta-belgilari butun matnning boshi va oxirini bildiradi. Agar ushbu modifikator ko'rsatilgan bo'lsa, ular mos ravishda matnning har bir satrining boshi va oxirini ko'rsatadi.
s Odatiy metabelgi "." o'z ta'rifida yangi qator belgisini o'z ichiga olmaydi. Bular. ko'p qatorli matn uchun /.+/ ifodasi kutilganidek butun matnni emas, faqat birinchi qatorni qaytaradi. Ushbu modifikatorni belgilash ushbu cheklovni olib tashlaydi.
U Sukut bo'yicha barcha miqdoriy metabelgilarni "ochko'z emas" qiladi. Tilning ba'zi modifikatsiyalarida (xususan, PHPda) "U" o'rniga "g" belgisi qo'llaniladi, bu ma'noga ko'proq mos keladi ("g" inglizcha "ochko'z", "ochko'z" so'zining qisqartmasi. ).

Jadvalda muntazam iboralarning eng mashhur va kerakli namunalari keltirilgan. Ulardan ba'zilari sizga murakkab va og'ir tuyulishi mumkin, ammo batafsil o'rganish bilan siz shubhasiz tushunasiz.

PHPda oddiy ifodalar.

PHPda muntazam iboralar bilan ishlash uchun maxsus funksiyalar mavjud bo'lib, ularning ro'yxati va qisqacha tavsifi jadvalda keltirilgan:

int preg_match (satr namunasi, satr mavzusi [, massiv mos keladi])

Funktsiya mavzu mazmuni naqsh namunasiga mos kelishini tekshiradi. Agar mosliklar topilsa 1 ni qaytaradi, aks holda 0 ni qaytaradi. Agar ixtiyoriy matchlar massivi parametrini belgilasangiz, funksiya bajarilganda unga bitta element kiritiladi - birinchi moslik topilgan.

"; print_r($found); ?>

int preg_match_all (satr namunasi, satr mavzusi, massiv mos keladi [, int tartibi])
Funktsiya avvalgisi bilan bir xil, yagona farqi shundaki, u butun matnni qidiradi va matches massivida topilgan HAMMA mosliklarni qaytaradi.
aralash preg_replace (aralash naqsh, aralash almashtirish, aralash mavzu [, int chegarasi])
Oldingi ikkala funksiya singari, preg_replace naqshga mos keladigan matn qismini qidiradi. Funktsiya barcha topilgan fragmentlarni parametrlarda ko'rsatilgan matn bilan almashtiradi.Tozalashdan oldin:\n$text\n\n"; $text = preg_replace("/(\n \s(2,))/"," ",$matn); echo " Tozalashdan keyin:\n$text"; // maxsus belgilardan tozalangan matnni ko'rsatadi // va qo'shimcha bo'shliqlar?>
aralash preg_replace_callback (aralash naqsh, aralash qayta qo'ng'iroq, aralash mavzu [, int limiti])
Funktsiya avvalgisining kengaytirilgan versiyasidir. Asosiy farq shundaki, bu funktsiya parametrlarda matnni tahlil qiladigan va almashtirish matnini yaratadigan funktsiya nomini beradi.
preg_split massivi (satr namunasi, satr mavzusi [, int chegarasi [, int bayroqlari]])
Bu funksiya explode() va split() funksiyalariga o'xshaydi. Uning o'ziga xosligi shundaki, ajratuvchi turg'un qator emas, balki muntazam ifodadir. Funktsiya manba ma'lumotlarini elementlarga ajratadi va ularni chiqish massiviga joylashtiradi.
preg_grep massivi (satr namunasi, massiv kiritish)
Funktsiya massivlarda muntazam qidirish uchun mo'ljallangan. Qidiruv uchun shablon va kirish ma'lumotlari massivi ko'rsatiladi va faqat shablonga mos keladigan elementlardan iborat massiv qaytariladi.

Ko'rib chiqilgan funktsiyalar ro'yxati to'liq emas, ammo bu oddiy iboralar bilan ishlashni muvaffaqiyatli boshlash uchun etarli. Agar siz ushbu mavzuga qiziqsangiz, qo'shimcha adabiyotlarni o'qing (masalan, Fridlning "Oddiy iboralar" kitobi). Bundan tashqari, o'quv maqsadlari uchun men muntazam iboralarni sinab ko'rish uchun maxsus dasturlardan birini o'rnatishni tavsiya qilaman (masalan, "PCRE" yoki "RegEx Builder").

Muntazam iboralar haqida eslatma. Ular nima uchun kerak, ular qayerda ishlatiladi va ulardan qanday foydalanish kerak. Boshqacha aytganda, PHP da qidirish haqida.

Oddiy ifodalar kerakli ma'lumotlarni topish uchun qidiruvda foydalaniladigan ko'rsatkichlar to'plamidir.

PHP funksiyalarida muntazam ifodalardan foydalanish, almashtirish, qidirish.

Masalan, ushbu funktsiyani ko'rib chiqing:

preg_replace("/( ]*>)(.*?)(<\/div>)/i", "$1$3", $string);

Ushbu funktsiyaning ichida nima bor, bu tushunarsiz ko'rinadigan barcha qiymatlar deyiladi muntazam ifoda (PHP RegEx). Ular ma'lum ma'lumotlarni qidirish uchun ishlatiladi.

Qidiruv namunasi (belgilar) tildan kelib chiqadi Perl.

Muntazam iboralar bo'linadi metabelgilar Va modifikatorlar metabelgilar.

Metabelgilar - muntazam belgilar guruhini aniqlang. Modifikatorlar ushbu belgilarning qancha va qanchasini izlash kerakligini tushunishga yordam beradi.

Muntazam ifoda meta-belgilari

Yuqoridagi misoldagi ba'zi metabelgilarning ma'nolari (ular ham quyida paydo bo'ladi):

^ - qatorning boshlanishi
\ - keyingi elementni oddiy belgi sifatida ko'rib chiqing (buyruq emas)
. - bitta ixtiyoriy (har qanday tasodifiy) belgi
() - guruhlash (pastki niqob)
- belgilar sinfi
$ - qator oxiri
| - muqobil (yoki)

Muntazam ifoda modifikatorlari

* - 0 dan cheksizgacha takrorlang
? - 1 marta yoki undan kamroq qidirish

Ko'proq modifikatorlar, ammo joriy misollarda ishlatilmaydi:

1 yoki undan ortiq marta takrorlang
(n) - aniq marta soni (n raqamini raqam bilan almashtiring)
(n,5) - kamida 5 marta
(n,m) - n dan kam emas, lekin m dan ortiq emas

Yuqoridagi har qanday modifikator "?" o'zgartiruvchisi bilan birlashtirilishi mumkin. Qidiruvni cheklash kerak, chunki standart barcha meta-belgilar printsipga muvofiq takrorlanadi "ochko'zlik" (cheklanmagan).

Masalan:

(<.*>) - barcha teglar bilan butun qatorni topadi
(<.*?>) - faqat teglarni topadi

Qo'shimcha variantlar

Modifikatorlar va meta-belgilarga qo'shimcha ravishda variantlar mavjud (barchasi ro'yxatga kiritilmagan):

/i - katta harf muhim emas (kichik va katta harf)
/s - nuqtalar (.) qatorlarni uzadi va karetani qaytaradi (chapga siljish).
/U - barcha miqdoriy meta-belgilarni "ochko'z bo'lmagan" ga aylantiradi.

Variantlar birgalikda birlashtirilishi mumkin:

Shablonlar

Metabelgilarning analogi kabi naqshlar ham mavjud, ulardan biri:

\n - yangi qator

Ushbu sahifada barcha oddiy ifoda variantlari ro'yxati yo'q. Bu yangi boshlanuvchini chalkashtirmaslik va shu bilan birga unga qidirish uchun asosiy vositalarni berish uchun maxsus amalga oshiriladi. Kelajakda, agar siz batafsilroq ma'lumotga ega bo'lishni istasangiz, Internetda batafsil ko'rsatmalarni topishingiz mumkin.

Tajribalar

Ushbu saytda oddiy iboralar bilan tajriba o'tkazishingiz mumkin. Yuqoridagi oddiy iborani va quyida izlayotgan html ma'lumotlarini kiriting. Agar siz to'g'ri muntazam ifodani tanlasangiz, sizga kerak bo'lgan kod bo'limi ajratib ko'rsatiladi.

Muntazam iboralar matndagi pastki qatorlarni qidirish uchun maxsus naqshlardir. Ularning yordami bilan siz quyidagi muammolarni bir qatorda hal qilishingiz mumkin: "satrda raqamlar mavjudligini tekshiring", "matndagi barcha elektron pochta manzillarini toping", "bir nechta ketma-ket savol belgilarini bitta bilan almashtiring".

Keling, bitta mashhur dasturlash donoligidan boshlaylik:

Ba'zi odamlar muammoga duch kelganda: "Ha, men aqlliman, men buni oddiy iboralar yordamida hal qilaman" deb o'ylashadi. Endi ularning ikkita muammosi bor.

Shablonlar misollar

Keling, bir nechta oddiy misollardan boshlaylik. Quyidagi rasmdagi birinchi ibora 3 harfdan iborat ketma-ketlikni qidiradi, bu erda birinchi harf "k", ikkinchisi har qanday rus harfi va uchinchisi "t" harfi katta-kichik harflarga sezgir emas (masalan, "mushuk" yoki "KOT" ” ushbu naqshga mos keladi). Ikkinchi ifoda matnni 12:34 formatidagi vaqtni qidiradi.

Har qanday ifoda ajratuvchi belgi bilan boshlanadi. Odatda u sifatida / belgisi ishlatiladi, lekin siz oddiy iboralarda maxsus maqsadga ega bo'lmagan boshqa belgilarni ham ishlatishingiz mumkin, masalan, ~, # yoki @. Agar ifodada / belgisi paydo bo'lishi mumkin bo'lsa, muqobil ajratuvchilar ishlatiladi. Keyin biz izlayotgan satrning naqshi keladi, undan keyin ikkinchi ajratuvchi keladi va oxirida bir yoki bir nechta bayroq harflari bo'lishi mumkin. Ular matnni qidirishda qo'shimcha variantlarni belgilaydilar. Mana bayroqlarga misollar:

  • i - qidiruv katta-kichik harflarga sezgir bo'lmasligi kerakligini aytadi (sukut bo'yicha katta-kichik harf sezgir)
  • u - izlanayotgan ibora va matn faqat lotin harflari emas, balki utf-8 kodlashidan foydalanishini aytadi. Busiz ruscha (va boshqa lotin bo'lmagan) belgilarni qidirish to'g'ri ishlamasligi mumkin, shuning uchun uni har doim o'rnatishingiz kerak.

Shablonning o'zi oddiy belgilar va maxsus konstruktsiyalardan iborat. Masalan, oddiy iboralardagi "k" harfi o'zini anglatadi, ammo belgilar "bu joyda 0 dan 5 gacha bo'lgan istalgan raqam bo'lishi mumkin" degan ma'noni anglatadi. Bu erda maxsus belgilarning to'liq ro'yxati (PHP qo'llanmasida ular metabelgilar deb ataladi) va oddiy ketma-ketlikdagi barcha boshqa belgilar oddiy:

Quyida biz ushbu belgilarning har birining ma'nosini tahlil qilamiz (shuningdek, birinchi iborada nima uchun "e" harfi alohida joylashtirilganligini tushuntiramiz), ammo hozircha matnga oddiy iboralarimizni qo'llashga harakat qilaylik va nima sodir bo'lishini ko'rib chiqaylik. PHPda preg_match ($regexp, $text, $match) maxsus funksiyasi mavjud boʻlib, u kirish sifatida muntazam ifoda, matn va boʻsh massivni oladi. U matnda berilgan naqshga mos keladigan pastki satr mavjudligini tekshiradi va agar bo'lmasa 0 yoki mavjud bo'lsa 1 ni qaytaradi. Va o'tkazilgan massivda muntazam ketma-ketlik bilan birinchi topilgan moslik 0 indeksli elementga joylashtiriladi. Oddiy iboralarni turli satrlarga qo'llaydigan oddiy dastur yozamiz:

Misolni ko'rib chiqqandan so'ng, keling, muntazam iboralarni batafsil o'rganamiz.

Muntazam iboralardagi qavslar

Keling, turli xil qavslar nimani anglatishini ko'rib chiqaylik:

  • Jingalak qavslar a(1,5) oldingi belgining takrorlanish sonini belgilaydi - bu misolda ifoda ketma-ket 1 dan 5 tagacha "a" harflarini qidiradi.
  • Kvadrat qavslar "ushbu belgilarning istalgan birini" anglatadi, bu holda a, b, c, x, y, z harflari yoki 0 dan 5 gacha bo'lgan raqam. Kvadrat qavs ichida | kabi boshqa maxsus belgilar ishlamaydi. yoki * - ular muntazam belgini bildiradi. Agar kvadrat qavslar boshida ^ belgisi mavjud bo'lsa, unda ma'no teskarisiga o'zgaradi: "ko'rsatilganlardan tashqari har qanday belgi" - masalan [^a-c] "a, b yoki cdan tashqari har qanday belgi" degan ma'noni anglatadi.
  • Qavslar belgilar va ifodalarni guruhlaydi. Masalan, abc+ ifodasida ortiqcha belgisi faqat c harfiga ishora qiladi va bu ifoda abc, abcc, abccc kabi so‘zlarni qidiradi. Va agar siz a(bc)+ qavslarini qo'ysangiz, u holda miqdor ko'rsatkichi bc ketma-ketligini anglatadi va ifoda abc, abcbc, abcbcbc so'zlarini qidiradi.

Eslatma: siz kvadrat qavs ichida belgilar oralig'ini belgilashingiz mumkin, lekin ruscha e harfi alifbodan alohida ekanligini va "har qanday rus harfini" yozish uchun siz [a-yae] yozishingiz kerakligini unutmang.

Bexslashes

Agar siz oddiy iboralar boʻyicha boshqa oʻquv qoʻllanmalarini koʻrib chiqqan boʻlsangiz, ehtimol, teskari chiziq hamma joyda turlicha yozilganini payqagandirsiz. Qaerdadir ular bitta teskari chiziqni yozadilar: \d , lekin bu erda misollarda u 2 marta takrorlanadi: \\d . Nega?

Muntazam ifoda tili bir marta teskari chiziq yozishni talab qiladi. Biroq, PHPda bitta va qo'sh tirnoq ichidagi satrlarda teskari chiziq ham alohida ma'noga ega: satrlar haqida qo'llanma. Xo'sh, masalan, agar siz $ x = "\ $" yozsangiz; keyin PHP buni maxsus kombinatsiya sifatida ko'rib chiqadi va satrga faqat $ belgisini kiritadi (va oddiy ifoda mexanizmi undan oldingi teskari chiziq haqida bilmaydi). \$ ketma-ketligini satrga kiritish uchun teskari chiziqni ikki barobarga kiritishimiz va kodni $x = "\\$" shaklida yozishimiz kerak; .

Shu sababli, ba'zi hollarda (belgilar ketma-ketligi PHPda alohida ma'noga ega bo'lsa) bizdan teskari chiziqni ikki barobarga oshirish talab qilinadi:

  • Muntazam ifodada \$ yozish uchun kodga "\\$" yozamiz
  • Muntazam ifodada \\ yozish uchun har bir teskari chiziqni ikki barobarga yozamiz va "\\\\" deb yozamiz.
  • Oddiy formatda teskari chiziq va raqamni (\1) yozish uchun teskari chiziqni ikki barobarga oshirish kerak: "\\1"

Boshqa hollarda, bir yoki ikkita teskari chiziq bir xil natijani beradi: "\\d" va "\d" qatorga bir juft \d belgisini kiritadi - birinchi holda, 2 teskari qiyshiq chiziq teskari chiziq qo'yish ketma-ketligidir. , ikkinchi holatda maxsus ketma-ketlik yo'q va belgilar mavjud bo'lganidek kiritiladi. Echo yordamida satrga qaysi belgilar kiritilishini va oddiy ifoda mexanizmi nimani ko'rishini tekshirishingiz mumkin: echo "\$"; . Ha, bu qiyin, lekin nima qila olasiz?

Oddiy mavsumda maxsus dizaynlar

  • \d istalgan bitta raqamni qidiradi, \D - raqamdan tashqari istalgan bitta belgi
  • \w har qanday bitta harfga (har qanday alifboda), raqamga yoki pastki chiziqqa mos keladi _ . \W harf, raqam yoki pastki chiziqdan tashqari har qanday belgiga mos keladi.

Shuningdek, so'z chegarasini ko'rsatish uchun qulay shart mavjud: \b . Bu konstruksiya uning bir tomonida harf/raqam/pastki chiziq (\w) bo‘lgan belgi, boshqa tomonida esa bo‘lmagan belgi bo‘lishi kerakligini bildiradi. Masalan, biz matnda "mushuk" so'zini topmoqchimiz. Agar biz /cat/ui muntazam ifodasini yozsak, u bu harflar ketma-ketligini istalgan joyda topadi - masalan, "qoramol" so'zi ichida. Bu biz xohlagan narsa emasligi aniq. Agar oddiy iboraga so'z chegarasi shartini qo'shsak: /\bcat\b/ui , endi faqat "mushuk" mustaqil so'zi qidiriladi.

Qo'llanma

  • PHPda muntazam ifoda sintaksisi, batafsil tavsif