Escaparea caracterelor speciale în expresiile regulate PHP

Să presupunem că vrem ca un caracter special să reprezinte el însuși. Pentru aceasta acesta trebuie escapat folosind backslash-ul. Să vedem câteva exemple.

Exemplul

În următorul exemplu, autorul expresiei regulate a vrut ca șablonul de căutare să arate astfel: litera 'a', apoi plus '+', apoi litera 'x'. Cu toate acestea, autorul codului nu a escapat simbolul '+' și de aceea șablonul de căutare, în realitate, arată astfel: litera 'a' de una sau mai multe ori, apoi litera 'x':

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

Ca rezultat, în variabilă se va scrie următorul text:

php'a+x ! ! !'

Exemplul

Acum autorul a escapat plusul cu backslash. Acum șablonul de căutare arată așa cum trebuie: litera 'a', apoi plus '+', apoi litera 'x'.

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

Ca rezultat, în variabilă se va scrie următorul text:

php'! ax aax aaax'

Exemplul

În acest exemplu, șablonul arată astfel: litera 'a', apoi punctul '.', apoi litera 'x':

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

Ca rezultat, în variabilă se va scrie următorul text:

php'! abx azx'

Exemplul

În următorul exemplu, autorul a uitat să escape slash-ul și sub expresia regulată au căutat toate subșirurile, deoarece punctul neescapat reprezintă orice caracter:

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

Ca rezultat, în variabilă se va scrie următorul text:

php'! ! !'

Exemplul

Atenție la faptul că dacă uitați backslash-ul pentru punct (când acesta ar trebui să reprezinte el însuși) - acest lucru s-ar putea să nu fie observat:

php<?php
  preg_replace('#a.x#', '!', 'a.x'); // va returna '!', așa cum ne-am dorit
?>

Vizual, funcționează corect (deoarece punctul reprezintă orice caracter, inclusiv un punct obișnuit '.'). Dar dacă schimbăm șirul, în care se fac înlocuirile - ne vom vedea eroarea:

php<?php
  preg_replace('#a.x#', '!', 'a.x abx azx'); // va returna '! ! !', dar se aștepta '! abx azx'
?>