2009-11-24 2 views
4

J'essaie d'échapper à des caractères regex-réservés avec une barre oblique inverse (ne demandez pas - il suffit de dire que je ne cherche pas à analyser HTML :) :) Et je reçois quelque chose d'étrange.PHP: Echapper à des caractères réservés à RegEx - quelqu'un sait ce qui ne va pas avec ça?

$regex_chars = array('[' , '\\' , '^', '$' , '.' , '|' , 
    '?' , '*' , '+' , '(' , ')'); 
$regex_chars_escaped = array('\[ ' , '\\\\ ' , '\^ ', '\& ' , 
    '\. ' , '\| ' , '\? ' , '\* ' , '\+ ' , '\(' , '\)'); 
$escaped_string = str_replace($regex_chars,$regex_chars_escaped, 
    implode("",$regex_chars)); 
echo implode('&nbsp;',$regex_chars) . "<br />"; 
echo $escaped_string; 

Les espaces servent à la clarté. C'est la sortie

[ \^$ . | ? * + () 
\\ [ \\ \^ \& \. \| \? \* \+ \(\) 

Tout va bien, sauf pour la première partie. D'où vient le "\\" et pourquoi n'est-ce pas "\ ["?

Répondre

21

Pourquoi ne pas simplement utiliser preg_quote?

+11

probablement parce que je suis un putain de crétin. Je vous remercie! – Greg

+0

De rien Greg. –

+0

+1 sur votre commentaire pas parce que vous êtes un crétin, mais parce que vous êtes un crétin drôle. – Ben

2

Je crois que c'est juste à cause de l'ordre dans lequel vous mettez les caractères dans le tableau. Essayez ceci:

$regex_chars = array('\\' , '[' , '^', '$' , '.' , '|' , 
     '?' , '*' , '+' , '(' , ')'); 
$regex_chars_escaped = array('\\\\ ' ,'\[ ', '\^ ', '\& ' , 
     '\. ' , '\| ' , '\? ' , '\* ' , '\+ ' , '\(' , '\)'); 

Et vous devriez obtenir la sortie attendue. Vérifiez la 'gotchas potentiels' section dans le str_replace function spec

+0

J'ai fini par utiliser preg_quote, mais c'est utile de savoir, merci. – Greg

Questions connexes