<?php
$a='/\\\/';
$b='/\\\\/';
var_dump($a);//string '/\\/' (length=4)
var_dump($b);//string '/\\/' (length=4)
var_dump($a===$b);//boolean true
?>为什么带有3个反斜杠的字符串与PHP中具有4个反斜杠的字符串相等?
我们能在正则表达式中使用3反斜杠版本吗?
PHP引用说我们必须使用4个反斜杠。
注意:单引号和双引号的PHP字符串具有反斜杠的特殊含义。因此,如果\必须与正则表达式\\匹配,则必须在PHP代码中使用"\\\\"或'\\\\'。
发布于 2015-01-21 08:31:05
$b='/\\\\/';php逐字符解析字符串文字(或多或少)。第一个输入符号是正斜杠。结果是(解析步骤的结果)中的正斜杠,输入符号(一个字符,/)被从输入中删除。
下一个输入符号是反斜杠。它是从输入中提取的,下一个字符/符号将被检查。这也是个反斜杠。这是一个有效的组合,因此第二个符号也是从输入中提取的,结果是一个单一的黑斜杠(对于两个输入符号)。
第三和第四反斜杠也是如此。
最后一个输入符号(在文字中)是结果中的正斜杠->正斜杠。
-> /\\/
现在对于带有三个反斜杠的字符串:
$a='/\\\/';php“查找”第一个黑斜杠,下一个字符是一个黑斜杠--这是一个有效的组合,结果中只有一个黑斜杠,而输入文字中的两个字符都被删除了。php然后“找到”第三个黑斜杠,下一个字符是正斜杠,这不是一个有效的组合。结果就是一个黑斜杠(因为php喜欢并原谅了你.)只有一个字符从输入中取出来。下一个输入字符是正斜杠,结果是一个正斜杠.
-> /\\/
=>两种文字都编码相同的字符串。
发布于 2015-01-21 08:57:58
在有关Strings的页面上的文档中对此进行了解释。
在Single quoted一节中,它说:
指定字符串的最简单方法是将其括在单引号(字符
')中。 若要指定文字单引号,请使用反斜杠(\)转义它。若要指定文字反斜杠,请加倍(\\)。反斜杠的所有其他实例都将被视为文字反斜杠。
让我们尝试解释您的字符串:
$a='/\\\/';正斜杠(/)在PHP中没有特殊意义,它们表示自己。
第一个反斜杠(\)转义第二个反斜杠,如上文引用的第二段第一句所解释的那样。
第三个反斜杠代表自己,正如上面引号的最后一句所解释的,因为后面没有撇号(')或反斜杠(\)。
因此,变量$a包含以下字符串:/\\/。
在……上面
$b='/\\\\/';有两个反斜杠(第二个和第四个)由第一个反斜杠和第三个反斜杠转义。最后(运行时)字符串与$a:/\\/的字符串相同。
备注
上面的讨论是关于PHP源代码中字符串的编码。正如您所看到的,总是有多个(正确)方法来编码相同的字符串。其他选项(除了单引号或双引号中的字符串文本外,使用heredoc或nowdoc语法)是使用常量(例如,用于文字反斜杠),并从片段构建字符串。
例如:
define('BS', '\'); // can also use '\\', the result is the same
$c = '/'.BS.BS.'/';使用没有转义和一个反斜杠。常量BS包含一个文字反斜杠,它在任何地方都使用--反斜杠是其内在价值所必需的。在转义时需要反斜杠,然后使用真正的反斜杠(没有办法使用BS )。
在regex中转义是另一回事。首先,regex是在运行时和运行时解析的,上面的$a、$b和$c包含/\\/,不管它们是如何生成的。
然后,在regex中,忽略不后面跟着特殊字符的反斜杠(参见上面的区别,在PHP中,它被解释为文字反斜杠)。
结合PHP和regex
使事情变得复杂的可能性是无穷的。让我们尽量保持它们的简单性,并在PHP中为PHP提供一些指南
regex字符串用撇号(')括起来;这样,PHP只需要转义两个字符:撇号和反斜杠;/)的字符串时,使用#、~、!或@作为regex分隔符( regex本身不使用这种分隔符);这样,在regex中使用分隔符时不需要转义;regex字符中转义;f.e.,破折号(-)只有在字符类中才有特殊的意义;在它们之外,转义是无用的(即使在字符类中,它也可以不带引号地使用,如果它被放置在[...]内的第一个字符或最后一个字符,也没有任何特殊的意义);https://stackoverflow.com/questions/28062568
复制相似问题