2012-03-28 141 views
5

任何人都可以告诉我这里发生了什么?PHP和字符串中的反斜杠

<?php 
// true 
var_dump('\\ ' === '\ '); 

// false 
var_dump('\\\\ ' === '\\ '); 

// true 
var_dump('\\\\ ' === '\\\ '); 
+2

您是否尝试过打印字符串? – JJJ 2012-03-28 12:58:55

+1

是的,抛弃了十六进制码。他们真的不同,看起来\\由于某种原因被折叠为\,但它是用单引号字符串,它不应该发生在那里。 – 2012-03-28 13:01:13

+2

字符串是单引号还是双引号没有区别。在这两种情况下,转义字符的作用是相同的。 – JJJ 2012-03-28 13:02:25

回答

8

\字符串文字内引入了几种类型的转义序列,\\为字面转义序列“\”。但是,不解析为转义序列的\也被视为文字“\”。

为此,'\\ '代表字符串 “\”,'\\\\ '代表字符串 “\\”,就像'\\\ '。请尝试:

echo '\\\\ '; -> \\ 

请参阅http://php.net/manual/en/language.types.string.php#language.types.string.syntax.single

+0

我不知道\ \是用单引号字符串工作的,认为它只适用于'本身。 – 2012-03-28 13:10:15

+0

@DaliborKarlović它是这样设置的,所以你可以有一个以反斜杠结尾的单引号字符串,如果你不能避开反斜杠,你将无法用单引号将'string \'包装起来。 – DaveRandom 2012-03-28 13:15:50

+0

是的,我明白了,我的糟糕之处在于我试图在正则表达式中寻找文字\ n(而不是控件字符),所以preg_quote('#\ n#')产生了一个匹配的字符串,但是var_dump() - 由preg_quote()生成的值并使用它而不是。 现在我不得不使用#(\\\ n){2,}# – 2012-03-28 13:24:00

1

在第一个例子中,你会在第二

"\\ " 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) "\\ " 
} 

所有双斜线'\\'已被转换成单斜杠'\'和事务所斜杠保持不变。在单引号和双引号字符串中,转义工作方式相同。

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 

这是预期和记录的行为,虽然它可能很难包住你的头围绕它的面前。

+0

+1不错,易于阅读的解释... – ManseUK 2012-03-28 13:05:00