在看到我们的 apache 日志中出现一些错误后,我一直试图找出“为什么”。与我试图查找以反斜杠字符开头的字符串的 preg_match 命令相关的错误:
preg_match('/^\\/',$str)
它报告“preg_match():没有找到结束分隔符'/'”
出于好奇,我尝试了双引号而不是单引号,以及 1 到 6 个反斜杠的组合,它总是报告相同的错误。(我最终暂时将测试切换到 if(substr($str,0,1) == "\") {})
在看到我们的 apache 日志中出现一些错误后,我一直试图找出“为什么”。与我试图查找以反斜杠字符开头的字符串的 preg_match 命令相关的错误:
preg_match('/^\\/',$str)
它报告“preg_match():没有找到结束分隔符'/'”
出于好奇,我尝试了双引号而不是单引号,以及 1 到 6 个反斜杠的组合,它总是报告相同的错误。(我最终暂时将测试切换到 if(substr($str,0,1) == "\") {})
这是因为内部字符串文字被PHP\\
转换为单个字符串。\
因此,您的正则表达式是/^\/
,其中\
使尾部斜杠按字面意思翻译为斜杠,而不是作为结束分隔符。这使得正则表达式没有结束分隔符,所以 PCRE 抱怨。
您想要的结果是/^\\/
,并且要将其放在字符串文字中,您需要将反斜杠加倍,因此:
preg_match('/^\\\\/',$str)
也就是说,if($str[0] === '\\')
阅读起来更容易,执行起来也更快。
因为\\
将作为一个单一的逃脱\
你需要做:
preg_match('/^\\\\/',$str)
好吧,很奇怪,我只是从头开始再次运行我的测试,这次它使用了 4 个反斜杠,正如我所期望的那样。我最初的想法是单引号仍然使用第一个 \ 来限定第二个。所以我尝试了四个,但肯定在语法中搞砸了其他东西。
if(preg_match('/^\\\\/', $str)) {}
以上工作。
我认为这可能与'
(单引号)有关
尝试将它们更改为双引号"
。两个\
应该够了。