<?php
$a='/\\\/';
$b='/\\\\/';
var_dump($a);//string '/\\/' (length=4)
var_dump($b);//string '/\\/' (length=4)
var_dump($a===$b);//boolean true
?>
为什么在PHP中带有3个反斜杠的字符串等于?
而且我们可以在正则表达式中使用3反斜杠版本吗?
PHP reference说我们必须使用4个反斜杠。
注意:单引号和双引号的PHP字符串具有反斜杠的特殊含义。因此,如果\
必须与正则表达式\\
匹配,则必须在PHP代码中使用"\\\\"
或'\\\\'
。
$b='/\\\\/';
php逐字解析字符串文字(或多或少)。第一个输入符号是正斜杠。结果是结果(分析步骤)中的正斜杠,并且输入符号(一个字符,/)从输入中删除。下一个输入符号是反斜杠。它从输入中获取,并检查下一个字符/符号。这也是一个反斜杠。这是一个有效的组合,因此第二个符号也从输入中获取,并且结果是一个单斜杠(对于两个输入符号)。第三和第四反斜杠相同。最后一个输入符号(在文字内)是结果中的正斜杠->正斜杠。-> /\\/
现在是带有三个反斜杠的字符串:
$a='/\\\/';
php“查找”第一个黑斜线,下一个字符为黑斜线-这是一个有效的组合,导致结果中出现一个单个黑斜线,并采用输入文字中的两个字符。php然后“查找”第三个反斜杠,下一个字符为正斜杠,这不是有效的组合。因此,结果是一个单斜杠(因为php喜欢并原谅您....),并且从输入中仅取一个字符。下一个输入字符为正斜杠,结果中为正斜杠。-> /\\/
=>两个文字都编码相同的字符串。
在页面上有关Strings
的文档中进行了解释:
在Strings
部分下显示:
指定字符串的最简单方法是将其括在单引号(字符
Single quoted
)中。要指定文字单引号,请使用反斜杠(
Single quoted
)对其进行转义。要指定文字反斜杠,请将其加倍('
)。其他所有反斜杠实例将被视为文字反斜杠。
让我们尝试解释您的字符串:
\
斜杠(\\
)在PHP字符串中没有特殊含义,它们代表了自己。如上面引用的第二段的第一句中所述,第一个反斜杠($a='/\\\/';
)逃脱了第二个反斜杠。如上面引用的最后一句中所述,第三个反斜杠代表自己,因为它后面没有撇号(/
)或反斜杠(\
)。
结果,变量'
包含以下字符串:\
。
开
$a
有两个反斜杠(第二个和第四个),它们被第一个和第三个反斜杠转义。最终(运行时)字符串与
/\\/
相同:$b='/\\\\/';
。
上面的讨论是关于PHP源代码中字符串的编码。如您所见,对同一字符串进行编码总是有不止一种(正确)的方式。其他选项(除了使用单引号或双引号引起来的字符串文字,使用$a
或/\\/
语法),还可以使用常量(例如,使用文字反斜杠)并从片段中构建字符串。
例如:
heredoc
不使用转义符,反斜杠。常数
nowdoc
包含文字反斜杠,并且在其固有值需要反斜杠的任何地方都可以使用它。如果需要使用反斜杠进行转义,则使用真实的反斜杠(无法使用define('BS', '\'); // can also use '\\', the result is the same $c = '/'.BS.BS.'/';
表示此方法。)>
BS
中的转义是另一回事。首先,在运行时解析BS
,并且在运行时regex
,以上regex
和$a
包含$b
,无论它们如何生成。
然后,在$c
中,后面没有特殊字符的反斜杠将被忽略(请参见上面的差异,在/\\/
中,它将被解释为文字上的反斜杠)。
存在使事物复杂化的无限可能。让我们尝试使其更简单,并在regex
中放置一些有关PHP
的准则:
regex
字符串括在撇号(PHP
)中;这样,regex
仅需要转义两个字符:撇号和反斜线;'
)的字符串时,请使用PHP
,/
,#
或~
作为!
分隔符([ C0]本身);这样,当在@
中使用分隔符时,无需转义分隔符。regex
个字符转义;例如,破折号(regex
)仅在regex
中使用时才具有特殊含义;在它们外面没有必要对其进行转义(即使在字符类中,如果将其作为regex
外壳内的第一个或最后一个字符放置,也可以不加引号使用而没有任何特殊含义);