php - PHP 正则表达式模式中需要额外的反斜杠

标签 php regex pcre

测试 another user's question 的答案时我发现了一些我不明白的东西。问题是用一个空格替换字符串中的所有文字 \t \n \r 字符。

现在,我尝试的第一个模式是:

/(?:\\[trn])+/

令人惊讶的是,这不起作用。我在 Perl 中尝试了相同的模式并且效果很好。经过一些尝试和错误后,我发现 PHP 需要 3 或 4 个反斜杠来匹配该模式,如:

/(?:\\\\[trn])+/

/(?:\\\[trn])+/

这些模式 - 令我惊讶的是 - 都有效。为什么需要这些额外的反斜杠?

最佳答案

您需要 4 个反斜杠来表示正则表达式中的 1,因为:

  • 2 个反斜杠用于在字符串中进行反转义 ("\\\\"->\\)
  • 1 个反斜杠用于正则表达式引擎中的反转义 (\\->\)

来自 PHP 文档,

escaping any other character will result in the backslash being printed too1

因此 \\\[,

  • 1 个反斜杠用于对 \ 进行转义,一个保留是因为 \[ 无效 ("\\\["->\\[)
  • 1 个反斜杠用于正则表达式引擎中的反转义 (\\[ ->\[)

是的,它有效,但不是一个好的做法。

关于php - PHP 正则表达式模式中需要额外的反斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2145804/

相关文章:

php - 获取一级子节点的XPath

php - 为什么 mb_convert_case 在 PHP 5.4 中破坏了我的字符串,而在 5.2 中却没有?

php - 将行添加到 mysql 数据库时的 Ajax 警报

Java 正则表达式 : matches(pattern, 值)返回 true 但 group() 无法匹配

regex - PCRE 正则表达式可以匹配空字符吗?

regex - 为什么这里必须使用括号?

php - 我如何在当前登录用户的帐户中插入图像名称?

regex - 这个 BASH shell 脚本摘录有什么作用?

regex - 删除所有非键盘字符的正则表达式

regex - 强制正则表达式两边都用引号括起来,或者根本不括起来,而不重复表达式