任何人都可以告訴我這裏發生了什麼?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