2012-03-28 22 views
5

¿Alguien puede decirme qué está pasando aquí?PHP y barras invertidas en cadenas

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

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

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

¿Ha intentado imprimir las cuerdas? – JJJ

+1

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í. –

+2

No hay diferencia si una cadena es simple o doble. El carácter de escape funciona de manera idéntica en ambos casos. – JJJ

Respuesta

8

\ 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.

+0

No tenía idea de que \\ funciona en una cadena de una sola cita, pensé que solo funciona en 'sí mismo'. –

+0

@ 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

+0

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,} # –

1

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.

4

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.

+0

+1 agradable, fácil de leer la explicación ... – ManseUK

Cuestiones relacionadas