PHP Regular Ifodalarda Maxsus Belgilarni Ekranlash
Faraz qilaylik, biz maxsus belgining o‘zini anglatishini istaymiz. Buning uchun uni teskari chiziq (backslash) yordamida ekranlashimiz kerak. Keling, misollar orqali ko‘rib chiqaylik.
Misol
Quyidagi misolda regular ifoda muallifi qidiruv shabloni shunday ko‘rinishda bo‘lishini istagan: 'a' harfi,
keyin '+' belgisi, keyin 'x' harfi. Biroq, kod muallifi '+' belgisini ekranlamaganligi sababli
haqiqiy qidiruv shabloni shunday ko‘rinishga ega: 'a' harfi bir yoki bir necha marta, keyin
'x' harfi:
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
Natijada o‘zgaruvchiga quyidagi qiymat yoziladi:
'a+x ! ! !'
Misol
Endi esa muallif ortiqcha belgisini teskari chiziq bilan ekranladi. Endi qidiruv shabloni kerakli ko‘rinishga ega: 'a' harfi, keyin '+' belgisi,
keyin 'x' harfi.
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
Natijada o‘zgaruvchiga quyidagi qiymat yoziladi:
'! ax aax aaax'
Misol
Ushbu misolda shablon quyidagicha: 'a' harfi, keyin nuqta '.', keyin 'x' harfi:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
Natijada o‘zgaruvchiga quyidagi qiymat yoziladi:
'! abx azx'
Misol
Quyidagi misolda muallif nuqtani ekranlashni unutdi va regular ifoda barcha pastki qatorlarni qamrab oldi, chunki ekranlanmagan nuqta har qanday belgini anglatadi:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
Natijada o‘zgaruvchiga quyidagi qiymat yoziladi:
'! ! !'
Misol
Diqqat qiling, agar siz nuqta (u o‘zini anglatishi kerak bo‘lganida) uchun teskari chiziqni unutsangiz - buni sezish ham qiyin bo‘lishi mumkin:
<?php
preg_replace('#a.x#', '!', 'a.x'); // biz xohlagandek '!' ni qaytaradi
?>
Vizual jihatdan to‘g‘ri ishlaydi (chunki nuqta har qanday belgini, shu jumladan oddiy nuqta '.' ni ham anglatadi). Lekin agar almashtirishlar amalga oshiriladigan qatorni o‘zgartirsak - biz xatomizni ko‘ramiz:
<?php
preg_replace('#a.x#', '!', 'a.x abx azx'); // '! ! !' qaytaradi, kutayotgan edik '! abx azx'
?>