为什么3个反斜杠等于php中的4个反斜杠?

问题描述 投票:4回答:2
<?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代码中使用"\\\\"'\\\\'

php regex backslash
2个回答
3
投票
$b='/\\\\/';

php逐字解析字符串文字(或多或少)。第一个输入符号是正斜杠。结果是结果(分析步骤)中的正斜杠,并且输入符号(一个字符,/)从输入中删除。下一个输入符号是反斜杠。它从输入中获取,并检查下一个字符/符号。这也是一个反斜杠。这是一个有效的组合,因此第二个符号也从输入中获取,并且结果是一个单斜杠(对于两个输入符号)。第三和第四反斜杠相同。最后一个输入符号(在文字内)是结果中的正斜杠->正斜杠。-> /\\/

现在是带有三个反斜杠的字符串:

$a='/\\\/';

php“查找”第一个黑斜线,下一个字符为黑斜线-这是一个有效的组合,导致结果中出现一个单个黑斜线,并采用输入文字中的两个字符。php然后“查找”第三个反斜杠,下一个字符为正斜杠,这不是有效的组合。因此,结果是一个单斜杠(因为php喜欢并原谅您....),并且从输入中仅取一个字符。下一个输入字符为正斜杠,结果中为正斜杠。-> /\\/

=>两个文字都编码相同的字符串。


3
投票

在页面上有关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中,后面没有特殊字符的反斜杠将被忽略(请参见上面的差异,在/\\/中,它将被解释为文字上的反斜杠)。

结合PHP和正则表达式

存在使事物复杂化的无限可能。让我们尝试使其更简单,并在regex中放置一些有关PHP的准则:

  • 如果可能,将regex字符串括在撇号(PHP)中;这样,regex仅需要转义两个字符:撇号和反斜线;
  • 解析URL,路径或其他可能包含斜杠(')的字符串时,请使用PHP/#~作为!分隔符([ C0]本身);这样,当在@中使用分隔符时,无需转义分隔符。
  • 不需要时,请不要以regex个字符转义;例如,破折号(regex)仅在regex中使用时才具有特殊含义;在它们外面没有必要对其进行转义(即使在字符类中,如果将其作为regex外壳内的第一个或最后一个字符放置,也可以不加引号使用而没有任何特殊含义);
© www.soinside.com 2019 - 2024. All rights reserved.