PHP:转义RegEx保留字符 - 任何人都知道这有什么问题?

时间:2009-11-24 11:11:24

标签: php regex str-replace

我正试图用反斜杠来逃避正则表达式保留字符(不要问 - 足以说我不是要解析HTML :))而且我得到了一些奇怪的东西。

$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;

空间是为了清晰起见。这是输出

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

所以一切都很好,除了第一部分。 “\\”来自何处,为什么不是“\ [”?

2 个答案:

答案 0 :(得分:21)

为什么不简单地使用preg_quote

答案 1 :(得分:2)

我相信这只是因为你将字符放在数组中的顺序。试试这个:

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

你应该得到预期的输出。检查str_replace function spec

中的'潜在陷阱'部分