Escaping dei caratteri speciali nelle espressioni regolari di PHP
Supponiamo di voler fare in modo che un carattere speciale rappresenti se stesso. Per fare ciò è necessario escaparlo utilizzando il backslash . Vediamo alcuni esempi.
Esempio
Nell'esempio seguente, l'autore dell'espressione regolare voleva
che il modello di ricerca fosse così: la lettera
'a', poi il più '+', poi
la lettera 'x'. Tuttavia, l'autore del codice
non ha escapato il carattere '+' e quindi
il modello di ricerca in realtà è così:
la lettera 'a' una o più volte, poi
la lettera 'x':
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
Di conseguenza, nella variabile verrà memorizzato quanto segue:
'a+x ! ! !'
Esempio
Ora l'autore ha escapato il più con un backslash
. Ora il modello di ricerca è come dovrebbe essere: la lettera 'a', poi il più
'+', poi la lettera 'x'.
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
Di conseguenza, nella variabile verrà memorizzato quanto segue:
'! ax aax aaax'
Esempio
In questo esempio, il modello è così: la lettera
'a', poi il punto '.', poi
la lettera 'x':
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
Di conseguenza, nella variabile verrà memorizzato quanto segue:
'! abx azx'
Esempio
Nell'esempio seguente, l'autore si è dimenticato di escapare il punto e l'espressione regolare ha catturato tutte le sottostringhe, poiché il punto non escapato rappresenta qualsiasi carattere:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
Di conseguenza, nella variabile verrà memorizzato quanto segue:
'! ! !'
Esempio
Si noti che se ci si dimentica il backslash per il punto (quando dovrebbe rappresentare se stesso) - potrebbe passare addirittura inosservato:
<?php
preg_replace('#a.x#', '!', 'a.x'); // restituirà '!', come volevamo
?>
Visivamente funziona correttamente (poiché il punto
rappresenta qualsiasi carattere, incluso un punto normale
'.'). Ma se si cambia la stringa
in cui avvengono le sostituzioni - vedremo il nostro
errore:
<?php
preg_replace('#a.x#', '!', 'a.x abx azx'); // restituirà '! ! !', ma ci si aspettava '! abx azx'
?>