PHP:转义 RegEx 保留的字符 - 有人知道这有啥问题吗?

Posted

技术标签:

【中文标题】PHP:转义 RegEx 保留的字符 - 有人知道这有啥问题吗?【英文标题】:PHP: Escaping RegEx-reserved characters - anyone know what's wrong with this?PHP:转义 RegEx 保留的字符 - 有人知道这有什么问题吗? 【发布时间】:2010-12-19 20:24:16 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

中的'潜在问题'部分

【讨论】:

我最终使用了 preg_quote,但知道这一点很有用,谢谢。【参考方案2】:

为什么不直接使用preg_quote?

【讨论】:

可能是因为我是个该死的白痴。谢谢! +1 不是因为你是个该死的白痴,而是因为你是个该死的有趣的白痴。 特殊的正则表达式字符是: . \ + * ? [ ^ ] $ ( ) = ! | : -

以上是关于PHP:转义 RegEx 保留的字符 - 有人知道这有啥问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何转义字符串中的特定 HTML 标签

Java Regex 用于将带引号的字符串与转义引号匹配

php mysql转义特殊字符的函数都有哪些

Regex:过滤特殊字符(如日语),但保留表情符号

Java Regex:查找带转义的单引号文本

Regex.IsMatch(sMonth,"/d+")报错