Échappement des caractères spéciaux dans les regex PHP
Supposons que nous voulions qu'un caractère spécial désigne lui-même. Pour cela, il faut l'échapper avec un antislash. Regardons des exemples.
Exemple
Dans l'exemple suivant, l'auteur de l'expression régulière voulait
que le motif de recherche soit : la lettre
'a', puis le plus '+', puis
la lettre 'x'. Cependant, l'auteur du code
n'a pas échappé le symbole '+' et donc
le motif de recherche est en réalité :
la lettre 'a' une ou plusieurs fois, puis
la lettre 'x' :
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
En conséquence, la variable contiendra ceci :
'a+x ! ! !'
Exemple
Maintenant, l'auteur a échappé le plus avec un
antislash. Maintenant le motif de recherche est
comme il se doit : la lettre 'a', puis le plus
'+', puis la lettre 'x'.
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
En conséquence, la variable contiendra ceci :
'! ax aax aaax'
Exemple
Dans cet exemple, le motif est : la lettre
'a', puis le point '.', puis
la lettre 'x' :
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
En conséquence, la variable contiendra ceci :
'! abx azx'
Exemple
Dans l'exemple suivant, l'auteur a oublié d'échapper le point et l'expression régulière a correspondue à toutes les sous-chaînes, car le point non échappé désigne n'importe quel caractère :
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
En conséquence, la variable contiendra ceci :
'! ! !'
Exemple
Notez que si vous oubliez l'antislash pour le point (quand il doit désigner lui-même) - on peut même ne pas le remarquer :
<?php
preg_replace('#a.x#', '!', 'a.x'); // renvoie '!', comme nous le voulions
?>
Visuellement, cela fonctionne correctement (car le point
désigne n'importe quel caractère, y compris le point
normal '.'). Mais si on change la chaîne
dans laquelle les remplacements ont lieu - nous verrons notre
erreur :
<?php
preg_replace('#a.x#', '!', 'a.x abx azx'); // renvoie '! ! !', mais on attendait '! abx azx'
?>