我正试图用反斜杠来逃避正则表达式保留字符(不要问 - 足以说我不是要解析HTML :))而且我得到了一些奇怪的东西。
$regex_chars = array('[' , '\\' , '^', '$' , '.' , '|' ,
'?' , '*' , '+' , '(' , ')');
$regex_chars_escaped = array('\[ ' , '\\\\ ' , '\^ ', '\& ' ,
'\. ' , '\| ' , '\? ' , '\* ' , '\+ ' , '\( ' , '\)');
$escaped_string = str_replace($regex_chars,$regex_chars_escaped,
implode("",$regex_chars));
echo implode(' ',$regex_chars) . "<br />";
echo $escaped_string;
空间是为了清晰起见。这是输出
[ \ ^ $ . | ? * + ( )
\\ [ \\ \^ \& \. \| \? \* \+ \( \)
所以一切都很好,除了第一部分。 “\\”来自何处,为什么不是“\ [”?
答案 0 :(得分:21)
为什么不简单地使用preg_quote?
答案 1 :(得分:2)
我相信这只是因为你将字符放在数组中的顺序。试试这个:
$regex_chars = array('\\' , '[' , '^', '$' , '.' , '|' ,
'?' , '*' , '+' , '(' , ')');
$regex_chars_escaped = array( '\\\\ ' ,'\[ ', '\^ ', '\& ' ,
'\. ' , '\| ' , '\? ' , '\* ' , '\+ ' , '\( ' , '\)');
你应该得到预期的输出。检查str_replace function spec
中的'潜在陷阱'部分