【问题标题】:How to match backslash at beginning of line in PHP如何在PHP中的行首匹配反斜杠
【发布时间】:2013-06-11 19:21:06
【问题描述】:

在我们的 apache 日志中看到一些错误后,我一直试图找出“为什么”。与我试图查找以反斜杠字符开头的字符串的 preg_match 命令相关的错误:

preg_match('/^\\/',$str)

它报告“preg_match(): 没有找到结束分隔符'/'”

出于好奇,我尝试了双引号而不是单引号,以及 1 到 6 个反斜杠的组合,但它总是报告相同的错误。 (我最终暂时将测试切换到 if(substr($str,0,1) == "\") {})

【问题讨论】:

  • 为什么不substr($str, 0, 1) === '\\' 甚至$str[0] === '\\'
  • @Gumbo:我不得不三思而后行 === 才意识到确实需要消除误报。你这样做是故意的还是只是一个好习惯?感谢“心理矫正”! :-)
  • @Gumbo: ...aa 事实证明它毕竟不是必需的。 WTF php,我认为'0' == '\\'true,因为第一个是数字。我需要停止使用那种语言。 ;-)
  • @Jon 只是一种习惯。如果我希望结果与我要比较的值的数据类型相同,我将使用===
  • @Gumbo:好习惯。我做得不够。

标签: php regex preg-match delimiter backslash


【解决方案1】:

这是因为字符串文字中的 \\ 被 PHP 转换为单个 \

因此,您的正则表达式是/^\/,其中\ 使尾部斜杠按字面意思翻译为斜杠,而不是作为结束分隔符。这使得正则表达式没有结束分隔符,因此 PCRE 抱怨。

您想要的结果是/^\\/,要将其放在字符串文字中,您需要将反斜杠加倍,所以:

preg_match('/^\\\\/',$str)

也就是说,if($str[0] === '\\') 更易于阅读且执行速度更快。

【讨论】:

    【解决方案2】:

    因为\\ 将作为单个\ 转义,您需要这样做:

    preg_match('/^\\\\/',$str)
    

    【讨论】:

    • 是的,刚刚想通了 - 谢谢。不知道我第一次尝试时做了什么,但无论如何我都遇到了同样的错误。从头开始重建我的测试代码时让它工作。
    • 很好,然后选择此选项作为帮助他人的答案。
    【解决方案3】:

    好吧,很奇怪,我刚刚从头开始再次运行我的测试,这次它使用了 4 个反斜杠,正如我所期望的那样。我最初的想法是单引号仍然使用第一个 \ 来限定第二个。所以我尝试了四个,但一定是在语法上搞砸了。

    if(preg_match('/^\\\\/', $str)) {}
    

    以上工作。

    【讨论】:

      【解决方案4】:

      我认为这可能与'(单引号)有关

      尝试将它们更改为双引号 "。两个\ 应该就够了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        • 1970-01-01
        • 2017-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多