首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在php中3反斜杠等于4反斜杠?

为什么在php中3反斜杠等于4反斜杠?
EN

Stack Overflow用户
提问于 2015-01-21 08:24:30
回答 2查看 1.7K关注 0票数 5
代码语言:javascript
复制
<?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代码中使用"\\\\"'\\\\'

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-21 08:31:05

代码语言:javascript
复制
$b='/\\\\/';

php逐字符解析字符串文字(或多或少)。第一个输入符号是正斜杠。结果是(解析步骤的结果)中的正斜杠,输入符号(一个字符,/)被从输入中删除。

下一个输入符号是反斜杠。它是从输入中提取的,下一个字符/符号将被检查。这也是个反斜杠。这是一个有效的组合,因此第二个符号也是从输入中提取的,结果是一个单一的黑斜杠(对于两个输入符号)。

第三和第四反斜杠也是如此。

最后一个输入符号(在文字中)是结果中的正斜杠->正斜杠。

-> /\\/

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

代码语言:javascript
复制
$a='/\\\/';

php“查找”第一个黑斜杠,下一个字符是一个黑斜杠--这是一个有效的组合,结果中只有一个黑斜杠,而输入文字中的两个字符都被删除了。php然后“找到”第三个黑斜杠,下一个字符是正斜杠,这不是一个有效的组合。结果就是一个黑斜杠(因为php喜欢并原谅了你.)只有一个字符从输入中取出来。下一个输入字符是正斜杠,结果是一个正斜杠.

-> /\\/

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

票数 4
EN

Stack Overflow用户

发布于 2015-01-21 08:57:58

在有关Strings的页面上的文档中对此进行了解释。

Single quoted一节中,它说:

指定字符串的最简单方法是将其括在单引号(字符')中。 若要指定文字单引号,请使用反斜杠(\)转义它。若要指定文字反斜杠,请加倍(\\)。反斜杠的所有其他实例都将被视为文字反斜杠。

让我们尝试解释您的字符串:

代码语言:javascript
复制
$a='/\\\/';

正斜杠(/)在PHP中没有特殊意义,它们表示自己。

第一个反斜杠(\)转义第二个反斜杠,如上文引用的第二段第一句所解释的那样。

第三个反斜杠代表自己,正如上面引号的最后一句所解释的,因为后面没有撇号(')或反斜杠(\)。

因此,变量$a包含以下字符串:/\\/

在……上面

代码语言:javascript
复制
$b='/\\\\/';

有两个反斜杠(第二个和第四个)由第一个反斜杠和第三个反斜杠转义。最后(运行时)字符串与$a/\\/的字符串相同。

备注

上面的讨论是关于PHP源代码中字符串的编码。正如您所看到的,总是有多个(正确)方法来编码相同的字符串。其他选项(除了单引号或双引号中的字符串文本外,使用heredocnowdoc语法)是使用常量(例如,用于文字反斜杠),并从片段构建字符串。

例如:

代码语言:javascript
复制
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只需要转义两个字符:撇号和反斜杠;
  • 当解析URL、路径或其他可以包含正斜杠(/)的字符串时,使用#~!@作为regex分隔符( regex本身不使用这种分隔符);这样,在regex中使用分隔符时不需要转义;
  • 当不需要时,不要在regex字符中转义;f.e.,破折号(-)只有在字符类中才有特殊的意义;在它们之外,转义是无用的(即使在字符类中,它也可以不带引号地使用,如果它被放置在[...]内的第一个字符或最后一个字符,也没有任何特殊的意义);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28062568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档