¿Alguien puede decirme qué está pasando aquí?PHP y barras invertidas en cadenas
<?php
// true
var_dump('\\ ' === '\ ');
// false
var_dump('\\\\ ' === '\\ ');
// true
var_dump('\\\\ ' === '\\\ ');
¿Alguien puede decirme qué está pasando aquí?PHP y barras invertidas en cadenas
<?php
// true
var_dump('\\ ' === '\ ');
// false
var_dump('\\\\ ' === '\\ ');
// true
var_dump('\\\\ ' === '\\\ ');
\
dentro de una cadena literal introduce varios tipos de secuencias de escape, \\
es la secuencia de escape para un literal "\". Pero, \
s que no se resuelven en una secuencia de escape también se toman como literal "\".
Por lo tanto, '\\ '
significa la cadena "\", '\\\\ '
significa la cadena "\\", al igual que '\\\ '
. Prueba:
echo '\\\\ '; -> \\
Ver http://php.net/manual/en/language.types.string.php#language.types.string.syntax.single.
No tenía idea de que \\ funciona en una cadena de una sola cita, pensé que solo funciona en 'sí mismo'. –
@ DaliborKarlović Está configurado así para que pueda tener una sola cadena entre comillas que finaliza con una barra diagonal inversa; si no puede escapar de la barra diagonal inversa, no podrá envolver 'cadena \' entre comillas simples. – DaveRandom
Sí, entiendo, lo malo es que estaba tratando de usarlo dentro de una expresión regular en busca de un \ n literal (no un char de control), por lo que preg_quote ('# \ n #') produjo una cadena que coincidía, pero var_dump() - ing el valor producido por preg_quote() y usando eso en cambio no. Ahora tuve que usar # (\\\ n) {2,} # –
En primera ejemplo, usted está comparando
"\ " and "\ " which is TRUE
en 2ª
"\\ " and "\ " which is FALSE
en tercera
"\\ " and "\\ " which is TRUE
Si imprime sus cadenas
$s = array('\ ', '\\ ', '\\\ ', '\\\\ ');
var_dump($s);
obtendrá
array(4) {
[0]=>
string(2) "\ "
[1]=>
string(2) "\ "
[2]=>
string(3) "\\ "
[3]=>
string(3) "\\ "
}
Todas las dobles barras '\\'
se han convertido en barras individuales-'\'
y sigle-barras siguen siendo los mismos. El escape funciona de la misma manera dentro de cadenas simples y comillas dobles.
En cadenas entre comillas simples, no se interpolan secuencias de escape. Una barra diagonal inversa es solo un carácter de escape si inmediatamente precede una comilla simple, o una barra diagonal inversa.
Así:
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
Se espera y el comportamiento documentado, aunque puede ser difícil para envolver alrededor de usted la cabeza en la cara de ella.
+1 agradable, fácil de leer la explicación ... – ManseUK
¿Ha intentado imprimir las cuerdas? – JJJ
Sí, arrojó los códigos hexadecimales. Son realmente diferentes, parece que un \\ se colapsó en \ por alguna razón, pero está en una cadena de una sola cita, no debería ocurrir allí. –
No hay diferencia si una cadena es simple o doble. El carácter de escape funciona de manera idéntica en ambos casos. – JJJ