Speciális karakterek escape-elése PHP reguláris kifejezésekben

Tegyük fel, hogy azt szeretnénk elérni, hogy egy speciális karakter önmagát jelölje. Ehhez escape-elni kell egy visszaperjelellel. Nézzük meg példákon.

Példa

A következő példában a reguláris kifejezés szerzője azt szerette volna, hogy a keresési minta így nézzen ki: az 'a' betű, majd egy plusz '+', majd az 'x' betű. Azonban a kód szerzője nem escape-elte a '+' karaktert, ezért a keresési minta valójában így néz ki: az 'a' betű egy vagy többször, majd az 'x' betű:

php<?php
  $str = 'a+x ax aax aaax';
  $res = preg_replace('#a+x#', '!', $str);
?>

Ennek eredményeképpen a változóba a következő íródik:

php'a+x ! ! !'

Példa

Most a szerző escape-elte a pluszt egy visszaperjelellel. Most a keresési minta olyan, amilyennek lennie kell: az 'a' betű, majd egy plusz '+', majd az 'x' betű.

php<?php
  $str = 'a+x ax aax aaax';
  $res = preg_replace('#a\+x#', '!', $str);
?>

Ennek eredményeképpen a változóba a következő íródik:

php'! ax aax aaax'

Példa

Ebben a példában a minta így néz ki: az 'a' betű, majd egy pont '.', majd az 'x' betű:

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

Ennek eredményeképpen a változóba a következő íródik:

php'! abx azx'

Példa

A következő példában a szerző elfelejtette escape-elni a pontot, és a reguláris kifejezés minden részsztringre illeszkedett, mivel az escape-elatlan pont bármely karaktert jelöl:

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

Ennek eredményeképpen a változóba a következő íródik:

php'! ! !'

Példa

Figyeljük meg, hogy ha elfelejtjük a visszaperjelet a pont előtt (amikor önmagát kellene jelölje) - ezt észre sem vehetjük:

php<?php
  preg_replace('#a.x#', '!', 'a.x'); // visszaadja '!'-t, ahogy szerettük volna
?>

Vizuálisan helyesen működik (mivel a pont bármely karaktert jelöl, beleértve a közönséges pontot '.' is). De ha megváltoztatjuk a sztringet, amiben a csere történik - látni fogjuk a hibánkat:

php<?php
  preg_replace('#a.x#', '!', 'a.x abx azx'); // visszaadja '! ! !'-t, de '! abx azx' vártuk
?>