preg_replace中需要转义的字符是哪些?

3
我注意到当替换文本中有 \ 字符时,该函数将不能按预期工作。因此我应该转义反斜杠。
还有哪些字符需要转义?我没有成功找到任何文档。
由于 preg_quote() 用于转义模式而非替换文本,因此我无法使用它。 再次编辑:以下是一个使用 单引号 的示例,说明反斜杠会导致问题:
 $replacement = '<head>content \0020 content</head>';
$subject = "<head>any header </head>";
$html_text = preg_replace ( "%<head>.*?</head>%s", $replacement, $subject, - 1, $count );
die ( $html_text );$subject, - 1, $count );
echo $html_text;

上面的示例应该打印:<head>content \0020 content</head>。但是它打印的是<head>content <head>any header </head>20 content</head>

2
不仅仅是正则表达式。你还需要考虑到你正在定义 PHP 字符串,以及 \0020,这在 PHP 中被视为一个八进制数。 - Marc B
@stribizhev:非贪婪量词不会导致回溯。 - Casimir et Hippolyte
@stribizhev:一个超时错误。例如当 </head> 不存在且字符串非常长时会发生。但是,非贪婪量词的想法是在获取每个字符之前测试模式的结尾。贪婪量词获取所有可能的字符,并返回一些字符(回溯),直到匹配成功为止。 - Casimir et Hippolyte
@CasimiretHippolyte:有没有一些关于它的网络参考资料可以阅读? - Wiktor Stribiżew
我认为你应该阅读这个 - Patrick
显示剩余9条评论
3个回答

0

\002 是一个八进制数,当在 Windows 终端上呈现时会显示一个微笑的 ☻,然后是 \0020 的尾随 0。在浏览器中查看时,您只会看到尾随的 0。有关转义序列,请参见双引号字符串。要使用双引号,您需要使用此\\\\0020

您还可以使用单引号字符串或Nowdoc

如果您从其他地方读取此字符串,则可以使用addslashes()


谢谢您的回答,但实际上我是从POST请求体中读取输入的,所以无法手动添加单引号,如何将变量字符串更改为单引号? - david
编辑过的,请使用addslashes()。 - AbraCadaver
addslashes转义函数也可以用于'和",以及&字符,虽然这些字符不需要进行转义。但是我该如何只转义反斜杠?谢谢。 - david
abraCadaver,似乎单引号反斜杠也会导致问题,它们应该被转义,对吗?我编辑了问题。 - david

-1
你要查找的文档在这里:元字符。这些是正则表达式中可以使用的特殊字符,这意味着如果你需要字面上搜索它们,你需要对它们进行转义。

这是针对模式而不是替换的。 - AbraCadaver
当然。在替换字符串中,不需要转义任何正则表达式,只需要转义搜索字符串。 - haz
根据您是使用单引号还是双引号,您可能需要转义PHP字符串,但正则表达式替换字符串是字面的。 - haz

-1

如果您想匹配一个字符,以下内容应该被转义

\ ^ . $ | ( ) [ ]     * + ? { } ,

这是针对模式而不是替换的。 - AbraCadaver
我不确定这一点,难道不应该在所有现代正则表达式(PCRE)中替换 . ^ $ * + - ? ( ) [ ] { } \ |,其中包括 PHP。 - thepiyush13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接