2012-03-28 3 views
5

Qualcuno può dirmi cosa sta succedendo qui?PHP e backslash nelle stringhe

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

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

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

Hai provato a stampare le stringhe? – JJJ

+1

Sì, ha scaricato i codici esadecimali. Sono davvero diversi, sembra che a \\ venga compresso \ per qualche motivo, ma è in una stringa con quotatura singola, non dovrebbe accadere lì. –

+2

Non c'è differenza se una stringa è quotata singola o doppia. Il personaggio di fuga funziona in modo identico in entrambi i casi. – JJJ

risposta

8

\ all'interno di una stringa letterale introduce diversi tipi di sequenze di escape, \\ è la sequenza di fuga per un letterale "\". Ma, \ s che non si risolvono in una sequenza di escape vengono anche prese come letterali "\".

Per questo, '\\ ' sta per la stringa "\", '\\\\ ' sta per la stringa "\\", proprio come '\\\ '. Prova:

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

Vedere http://php.net/manual/en/language.types.string.php#language.types.string.syntax.single.

+0

Non avevo idea che \\ funzioni in una stringa con quotatura singola, pensavo che funzionasse solo su "se stesso". –

+0

@ DaliborKarlović È impostato in modo tale da poter avere una singola stringa tra virgolette che termini con una barra rovesciata, se non si riuscisse a sfuggire alla barra inversa non sarebbe possibile racchiudere 'string \' tra virgolette singole. – DaveRandom

+0

Sì, ho capito, il mio male è che stavo cercando di usarlo all'interno di un'espressione regolare alla ricerca di un letterale \ n (non un carattere di controllo), quindi preg_quote ('# \ n #') ha prodotto una stringa che corrispondeva, ma var_dump() - il valore prodotto da preg_quote() e quello che non lo ha fatto. Ora ho dovuto usare # (\\\ n) {2,} # –

1

Nel primo esempio si sta confrontando

"\ " and "\ " which is TRUE 

nel 2 °

"\\ " and "\ " which is FALSE 

in 3 °

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

Se si stampa le corde

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

si otterrà

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

Tutte le doppie barre '\\' sono stati convertiti in single-slash '\' e sigle-slash rimangono gli stessi. L'escaping funziona allo stesso modo all'interno di stringhe singole e doppie.

4

In singole stringhe tra virgolette, nessuna sequenza di escape viene interpolata. Un backslash è solo un carattere di escape se precede immediatamente una virgoletta singola, o una barra rovesciata.

Quindi:

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 

Questo è previsto e il comportamento documentato, anche se può essere difficile da avvolgere intorno si testa sulla faccia di esso.

+0

+1 spiegazione piacevole, facile da leggere ... – ManseUK