Qualcuno può dirmi cosa sta succedendo qui?PHP e backslash nelle stringhe
<?php
// true
var_dump('\\ ' === '\ ');
// false
var_dump('\\\\ ' === '\\ ');
// true
var_dump('\\\\ ' === '\\\ ');
Qualcuno può dirmi cosa sta succedendo qui?PHP e backslash nelle stringhe
<?php
// true
var_dump('\\ ' === '\ ');
// false
var_dump('\\\\ ' === '\\ ');
// true
var_dump('\\\\ ' === '\\\ ');
\
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.
Non avevo idea che \\ funzioni in una stringa con quotatura singola, pensavo che funzionasse solo su "se stesso". –
@ 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
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,} # –
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.
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.
+1 spiegazione piacevole, facile da leggere ... – ManseUK
Hai provato a stampare le stringhe? – JJJ
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ì. –
Non c'è differenza se una stringa è quotata singola o doppia. Il personaggio di fuga funziona in modo identico in entrambi i casi. – JJJ