2012-03-28 127 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