2012-03-28 23 views
5

ここで何が起こっているのか教えていただけますか?文字列リテラル内のPHPと文字列のバックスラッシュ

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

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

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

文字列を印刷しようとしましたか? – JJJ

+1

ええ、六角形をダンプしました。彼らは本当に異なっている、\\何らかの理由で\に崩壊したようだが、それは一重引用符で囲まれた文字列にある、それはそこで起こるべきではない。 –

+2

文字列がシングルクォートかダブルクォートかは違いはありません。エスケープ文字は、どちらの場合も同じように機能します。 – JJJ

答えて

8

\\\リテラル「\」のエスケープシーケンスで、エスケープシーケンスのいくつかのタイプを紹介します。しかし、エスケープシーケンスに解決されない\はリテラル "\"としても扱われます。

したがって、'\\ 'は文字列 "\"を表し、'\\\\ 'は文字列 "\\"の略で、'\\\ 'と同じです。試してください:

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

http://php.net/manual/en/language.types.string.php#language.types.string.syntax.singleを参照してください。あなたは、文字列をプリントアウトした場合は第一の例では

+0

私は\\が一重引用符で囲まれた文字列で動作することは知らなかった。 –

+0

@DaliborKarlovićバックスラッシュでエスケープできない場合は、単一引用符で 'string \ 'を囲むことができない場合は、バックスラッシュで終わる単一引用符付き文字列を持つことができるように設定されています。 – DaveRandom

+0

ええ、私は悪いです、私は正規表現の中で\ n(制御文字ではない)を検索するので、preg_quote( '#\ n#')は一致した文字列を生成しました。 var_dump() - preg_quote()によって生成された値を代わりに使用していました。 #(\\\ n){2、}# –

1

あなたは第三

"\\ " and "\\ " which is TRUE 

に第二

"\\ " and "\ " which is FALSE 

"\ " and "\ " which is TRUE 

を比較している

$s = array('\ ', '\\ ', '\\\ ', '\\\\ '); 
var_dump($s); 

あなたは'\\'は、シングルスラッシュ'\'とSIGLEスラッシュに変換されたすべてのダブルスラッシュは同じまま

array(4) { 
    [0]=> 
    string(2) "\ " 
    [1]=> 
    string(2) "\ " 
    [2]=> 
    string(3) "\\ " 
    [3]=> 
    string(3) "\\ " 
} 

を取得します。 Escapingは、一重引用符で囲んだ文字列と二重引用符で囲まれた文字列で同じように動作します

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

関連する問題