任何人都可以告诉我这里发生了什么?PHP和字符串中的反斜杠
<?php
// true
var_dump('\\ ' === '\ ');
// false
var_dump('\\\\ ' === '\\ ');
// true
var_dump('\\\\ ' === '\\\ ');
任何人都可以告诉我这里发生了什么?PHP和字符串中的反斜杠
<?php
// true
var_dump('\\ ' === '\ ');
// false
var_dump('\\\\ ' === '\\ ');
// true
var_dump('\\\\ ' === '\\\ ');
\
字符串文字内引入了几种类型的转义序列,\\
为字面转义序列“\”。但是,不解析为转义序列的\
也被视为文字“\”。
为此,'\\ '
代表字符串 “\”,'\\\\ '
代表字符串 “\\”,就像'\\\ '
。请尝试:
echo '\\\\ '; -> \\
请参阅http://php.net/manual/en/language.types.string.php#language.types.string.syntax.single。
我不知道\ \是用单引号字符串工作的,认为它只适用于'本身。 – 2012-03-28 13:10:15
@DaliborKarlović它是这样设置的,所以你可以有一个以反斜杠结尾的单引号字符串,如果你不能避开反斜杠,你将无法用单引号将'string \'包装起来。 – DaveRandom 2012-03-28 13:15:50
是的,我明白了,我的糟糕之处在于我试图在正则表达式中寻找文字\ n(而不是控件字符),所以preg_quote('#\ n#')产生了一个匹配的字符串,但是var_dump() - 由preg_quote()生成的值并使用它而不是。 现在我不得不使用#(\\\ n){2,}# – 2012-03-28 13:24:00
在第一个例子中,你会在第二
"\\ " and "\ " which is FALSE
在第三
"\\ " and "\\ " which is TRUE
比较
"\ " and "\ " which is TRUE
如果你打印出你的字符串
$s = array('\ ', '\\ ', '\\\ ', '\\\\ ');
var_dump($s);
你会得到
array(4) {
[0]=>
string(2) "\ "
[1]=>
string(2) "\ "
[2]=>
string(3) "\\ "
[3]=>
string(3) "\\ "
}
所有双斜线'\\'
已被转换成单斜杠'\'
和事务所斜杠保持不变。在单引号和双引号字符串中,转义工作方式相同。
在单引号字符串中,不插入转义序列。反斜杠只是一个转义字符,如果它紧接在单引号之前,或反斜杠。
所以:
var_dump('\\ '); // String (2) "\ "
var_dump('\ '); // String (2) "\ "
// They do match
var_dump('\\\\ '); // String (3) "\\ "
var_dump('\\ '); // String (2) "\ "
// They don't match
var_dump('\\\\ '); // String (3) "\\ "
var_dump('\\\ '); // String (3) "\\ "
// They do match
这是预期和记录的行为,虽然它可能很难包住你的头围绕它的面前。
+1不错,易于阅读的解释... – ManseUK 2012-03-28 13:05:00
您是否尝试过打印字符串? – JJJ 2012-03-28 12:58:55
是的,抛弃了十六进制码。他们真的不同,看起来\\由于某种原因被折叠为\,但它是用单引号字符串,它不应该发生在那里。 – 2012-03-28 13:01:13
字符串是单引号还是双引号没有区别。在这两种情况下,转义字符的作用是相同的。 – JJJ 2012-03-28 13:02:25