2012-03-28 11 views
5

Quelqu'un peut-il me dire ce qui se passe ici?PHP et les barres obliques inverses dans les chaînes

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

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

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

Avez-vous essayé d'imprimer les chaînes? – JJJ

+1

Ouais, a jeté les hexcodes. Ils sont vraiment différents, il semble que \\ soit réduit à \ pour une raison quelconque, mais c'est dans une chaîne entre guillemets simples, cela ne devrait pas arriver là. –

+2

Il n'y a pas de différence entre une chaîne simple ou double. Le caractère d'échappement fonctionne de manière identique dans les deux cas. – JJJ

Répondre

8

\ l'intérieur d'une chaîne littérale introduit plusieurs types de séquences d'échappement, \\ est la séquence d'échappement pour un littéral « \ ». Mais, \ s qui ne se résolvent pas en une séquence d'échappement sont également pris comme littéral "\".

Par conséquent, '\\ ' représente la chaîne "\", '\\\\ ' représente la chaîne "\\", de même que '\\\ '. Essayez:

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

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

+0

Je n'avais aucune idée que \\ fonctionne dans une chaîne entre guillemets simples, pensait que cela ne fonctionne que sur lui-même. –

+0

@ DaliborKarlović Il est configuré comme ça pour que vous puissiez avoir une seule chaîne entre guillemets qui se termine par une barre oblique inverse. Si vous ne pouvez pas échapper à la barre oblique inverse, vous ne pourrez pas envelopper guillemets simples. – DaveRandom

+0

Ouais, je comprends, mon mauvais est que j'essayais de l'utiliser dans une regex cherchant un \ n littéral (pas un contrôle char), donc preg_quote ('# \ n #') a produit une chaîne qui correspondait, mais var_dump() - ing la valeur produite par preg_quote() et l'utilise à la place. Maintenant, je devais utiliser # (\\\ n) {2,} # –

1

Dans le 1er exemple, vous comparez

"\ " and "\ " which is TRUE 

en 2ème

"\\ " and "\ " which is FALSE 

en 3ème

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

Si vous imprimez vos chaînes

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

vous obtiendrez

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

Tous les doubles barres obliques '\\' ont été convertis en mono-barres obliques '\' et Sigle-barres obliques restent les mêmes. L'échappement fonctionne de la même manière à l'intérieur de chaînes simples et doubles.

4

Dans les chaînes à guillemets simples, aucune séquence d'échappement n'est interpolée. Une barre oblique inverse n'est qu'un caractère d'échappement si elle précède immédiatement une seule citation, ou une barre oblique inverse.

Alors:

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 

Cela devrait et le comportement documenté, mais il peut être difficile de vous envelopper la tête autour sur le visage de celui-ci.

+0

+1 belle, facile à lire l'explication ... – ManseUK

Questions connexes