5

我试图用反斜杠转义正则表达式保留的字符(不要问——只要说我没有试图解析 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;

空格是为了清楚。这是输出

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

所以一切都很好,除了第一部分。"\\" 来自哪里,为什么不是 "\[" ?

4

2 回答 2

22

为什么不简单地使用preg_quote

于 2009-11-24T11:12:42.847 回答
2

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

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

你应该得到预期的输出。检查str_replace 函数规范中的“潜在陷阱”部分

于 2009-11-24T11:29:38.377 回答