2015-11-25 15 views
6

Próbuję dopasować 008/mecz Preg ukośniki

preg_match('/008\\//i', '008/', $matches); 
preg_match('/008\//i', '008/', $matches); 

Moje pytanie brzmi, dlaczego oba wyrażeń regularnych działa. Oczekuję, że drugi będzie działał, ale dlaczego działa podwójny ukośnik?

+0

Przykład w pytaniu próbuje dopasować ukośnik, a nie ukośnik odwrotny. – Barmar

+0

Na wypadek, gdybyś nie był tego świadomy, '/' jako separator jest całkowicie dowolne. Kiedy szukam rzeczy, które zawierają ukośnik, często robię coś w rodzaju 'preg_match '(' # 008/# ', $ string, $ matches)', aby uniknąć ucieczki. – miken32

Odpowiedz

5

Ponieważ \\ w ciągach PHP oznacza "ucieczki backslash". Ponieważ \/ nic nie znaczy, nie trzeba go wymykać (nawet jeśli jest to możliwe), więc oceniają to samo.

Innymi słowy, oba z nich drukuje to samo:

echo '/008\\//i'; // prints /008\//i 
echo '/008\//i'; // prints /008\//i 

Odwrotny ukośnik jest one of the few characters that can get escaped in a single quoted string (oprócz oczywistej \'), co sprawia, że ​​można zrobić ciąg takich jak 'test\\' bez ucieczki ostatni zacytować.

+0

Przedni ukośnik musi zostać zmieniony w wyrażeniu regularnym ograniczonym przez '/'. Masz rację, że wynik końcowy jest taki sam i jest to ciąg przekazywany do kodu PCRE. – miken32

+0

Tak, miałem na myśli to, że '' \/'' nie ocenia nic specjalnego, ma taki sam efekt jak '' \\/''. Oczywiście to konkretne wyrażenie wymaga ucieczki przedniego ukośnika, a oba przykłady to robią, dlatego oba działają (są takie same). –