Czy ktoś może mi powiedzieć, co się tutaj dzieje?PHP i odwrotne ukośniki w ciągach znaków
<?php
// true
var_dump('\\ ' === '\ ');
// false
var_dump('\\\\ ' === '\\ ');
// true
var_dump('\\\\ ' === '\\\ ');
Czy ktoś może mi powiedzieć, co się tutaj dzieje?PHP i odwrotne ukośniki w ciągach znaków
<?php
// true
var_dump('\\ ' === '\ ');
// false
var_dump('\\\\ ' === '\\ ');
// true
var_dump('\\\\ ' === '\\\ ');
\
wewnątrz łańcuch znaków wprowadza kilka rodzajów sekwencje, \\
jest sekwencja ucieczki dla znaków „\”. Ale, \
s, które nie są zgodne z sekwencją specjalną, są również traktowane jako literał "\".
Therefor, '\\ '
oznacza ciąg "\", '\\\\ '
oznacza ciąg "\\", podobnie jak '\\\ '
. Wypróbuj:
echo '\\\\ '; -> \\
Zobacz http://php.net/manual/en/language.types.string.php#language.types.string.syntax.single.
Nie miałem pojęcia, że \\ działa w łańcuchu z jednym cudzysłowem, ale działa tylko na samym sobie. –
@ DaliborKarlović Jest ustawiony tak, aby można było użyć pojedynczego cudzysłowu, który kończy się ukośnikiem odwrotnym, jeśli nie można uciec od ukośnika odwrotnego, nie można zawijać ciągu '' w cudzysłowach. – DaveRandom
Tak, rozumiem, moim złym jest to, że próbowałem użyć go w regexie, szukając literału \ n (nie kontrolnego znaku), więc preg_quote ('# \ n #') wytworzył ciąg, który pasował, ale var_dump() - wartość wytworzona przez preg_quote() i zamiast tego użyła tego. Teraz musiałem użyć # (\\\ n) {2,} # –
W 1st przykład jesteś porównując
"\ " and "\ " which is TRUE
w 2.
"\\ " and "\ " which is FALSE
w 3
"\\ " and "\\ " which is TRUE
Jeśli wydrukować swoje struny
$s = array('\ ', '\\ ', '\\\ ', '\\\\ ');
var_dump($s);
dostaniesz
array(4) {
[0]=>
string(2) "\ "
[1]=>
string(2) "\ "
[2]=>
string(3) "\\ "
[3]=>
string(3) "\\ "
}
Wszystkie podwójne ukośniki '\\'
zostały przekształcone w pojedynczych ukośniki '\'
i Sigle-ukośniki pozostają takie same. Uciekanie działa tak samo w przypadku ciągów jedno- i dwu-cudzysłowowych.
W ciągach z pojedynczym cudzysłowiem sekwencje specjalne nie są interpolowane. Ukośnik odwrotny to tylko znak ucieczki, jeśli bezpośrednio poprzedza pojedynczy cytat, lub ukośnik odwrotny.
Więc:
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
Jest to oczekiwane zachowanie i udokumentowane, choć może być trudno owinąć głowę wokół na pierwszy rzut oka.
+1 miłego, łatwego do odczytania wyjaśnienia ... – ManseUK
Czy próbowałeś drukować struny? – JJJ
Tak, rzuciłem kody heksadecymalne. Są naprawdę różne, wydaje się, że \\ z powodu jakiegoś powodu zostaje zwinięte \, ale jest w jednym cudzysłowie, to nie powinno się tam zdarzać. –
Nie ma różnicy, czy ciąg jest pojedynczy czy podwójny. Znak ucieczki działa identycznie w obu przypadkach. – JJJ