2012-03-28 15 views
5

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('\\\\ ' === '\\\ '); 
+2

Czy próbowałeś drukować struny? – JJJ

+1

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

+2

Nie ma różnicy, czy ciąg jest pojedynczy czy podwójny. Znak ucieczki działa identycznie w obu przypadkach. – JJJ

Odpowiedz

8

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

+0

Nie miałem pojęcia, że ​​\\ działa w łańcuchu z jednym cudzysłowem, ale działa tylko na samym sobie. –

+0

@ 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

+0

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

1

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.

4

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.

+0

+1 miłego, łatwego do odczytania wyjaśnienia ... – ManseUK

Powiązane problemy