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<?php
  $str = 'a+x ax aax aaax';
  $res = preg_replace('#a+x#', '!', $str);
?>

Natijada o‘zgaruvchiga quyidagi qiymat yoziladi:

php'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<?php
  $str = 'a+x ax aax aaax';
  $res = preg_replace('#a\+x#', '!', $str);
?>

Natijada o‘zgaruvchiga quyidagi qiymat yoziladi:

php'! ax aax aaax'

Misol

Ushbu misolda shablon quyidagicha: 'a' harfi, keyin nuqta '.', keyin 'x' harfi:

php<?php
  $str = 'a.x abx azx';
  $res = preg_replace('#a\.x#', '!', $str);
?>

Natijada o‘zgaruvchiga quyidagi qiymat yoziladi:

php'! 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<?php
  $str = 'a.x abx azx';
  $res = preg_replace('#a.x#', '!', $str);
?>

Natijada o‘zgaruvchiga quyidagi qiymat yoziladi:

php'! ! !'

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<?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<?php
  preg_replace('#a.x#', '!', 'a.x abx azx'); // '! ! !' qaytaradi, kutayotgan edik '! abx azx'
?>