谁能告诉我这里发生了什么?
<?php
// true
var_dump('\\ ' === '\ ');
// false
var_dump('\\\\ ' === '\\ ');
// true
var_dump('\\\\ ' === '\\\ ');
答案 0 :(得分:8)
\
引入了几种类型的转义序列,\\
是文字“\”的转义序列。但是,不解析为转义序列的\
也被视为文字“\”。
因此,'\\ '
代表字符串“\”,'\\\\ '
代表字符串“\\”,就像'\\\ '
一样。尝试:
echo '\\\\ '; -> \\
请参阅http://php.net/manual/en/language.types.string.php#language.types.string.syntax.single。
答案 1 :(得分:4)
在单引号字符串中,不会插入转义序列。反斜杠只是一个转义字符,如果它紧接在单引号或反斜杠之前。
所以:
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
这是预期的和记录在案的行为,尽管很难将你的表面包裹起来。
答案 2 :(得分:1)
在第一个例子中,你正在比较
"\ " and "\ " which is TRUE
第二次
"\\ " and "\ " which is FALSE
in 3rd
"\\ " and "\\ " which is TRUE
如果你打印出你的字符串
$s = array('\ ', '\\ ', '\\\ ', '\\\\ ');
var_dump($s);
你会得到
array(4) {
[0]=>
string(2) "\ "
[1]=>
string(2) "\ "
[2]=>
string(3) "\\ "
[3]=>
string(3) "\\ "
}
所有双斜杠'\\'
都已转换为单斜杠'\'
,并且sigle-slashes保持不变。转义在单引号和双引号字符串中的工作方式相同。