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('\\\\ ' === '\\\ ');
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('\\\\ ' === '\\\ ');
\
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.
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. –
@ 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
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,} # –
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.
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.
+1 belle, facile à lire l'explication ... – ManseUK
Avez-vous essayé d'imprimer les chaînes? – JJJ
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à. –
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