![PHP (muntazam ifoda) - bu nima? Muntazam iboralarga misollar va sinash. PHP regexp: muntazam ifodalarga misollar Php muntazam ifodalar daraja belgilari](https://i0.wp.com/smileys/souriant.png)
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!
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 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;
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; )
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); ) )
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);
Xuddi shu narsa, faqat takrorlanadigan nuqtalar bilan.
$matn = preg_replace("/.+/i", ".", $matn);
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."[^>]*>(.*?)".$tag.">.")", $xml, $mos, PREG_PATTERN_ORDER); $ mosligini qaytarish; )
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; )
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."; )
Regexp bilan PHP kodining ushbu qiziqarli namunasi teglar orasidagi matnni topadi va qaytaradi
Feof($fp))( $page .= fgets($fp, 4096); ) $titre = eregi("
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) )[^"]*)"$"
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"
Ushbu misol kodi matn emotsiyasini grafik belgisiga o'zgartiradi. Qiziqarli va foydali PHP parchasi.
$texte="Smaylili matn:-)"; echo str_replace(":-)"," ",$ text);
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
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-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);
Keling, kod bazasida elektron pochta manzillarini topishimiz kerak bo'lgan misolni ko'rib chiqaylik. Bizning maqsadimiz:
Analog rozetkalar
Oddiy iboralar ikki turdagi belgilardan iborat:
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:
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
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
preg_match_all("/+@+(.+)*/i", $input_lines, $output_array);
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.
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)
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; )
[^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; )
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.
$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.
$subject = "7/11"; echo preg_replace("/(d+)/(d+)/", "$2/$1", $mavzu);
Natija
$subject = "2001-09-11"; echo preg_replace("/(d+)-(d+)-(d+)/", "$3/$2/$1", $mavzu);
Natija
$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 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("/(
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.
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)
* - 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
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:
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.
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.
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:
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.
Keling, turli xil qavslar nimani anglatishini ko'rib chiqaylik:
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.
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:
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?
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.