2015-11-25 15 views
6

Sto cercando di corrispondere 008/pregnenolone partita slash

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

mia domanda è perché fare entrambe le espressioni regolari di lavoro. Mi aspetto che il secondo funzioni, ma perché funziona il doppio backslash?

+0

L'esempio nella tua domanda sta cercando di far corrispondere una barra, non una barra rovesciata. – Barmar

+0

Nel caso in cui non si fosse a conoscenza, il '/' come delimitatore è totalmente arbitrario. Quando cerco cose che contengono una barra, farò spesso qualcosa come 'preg_match ('# 008/#', $ string, $ matches)' così posso evitare l'escape. – miken32

risposta

5

Perché \\ in stringhe PHP significa "escape the backslash". Dal \/ non significa nulla che non debba essere sfuggito (anche se è possibile), quindi valutano lo stesso.

In altre parole, sia di questi sarà stampare la stessa cosa:

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

La barra rovesciata è one of the few characters that can get escaped in a single quoted string (a parte l'ovvio \'), che assicura che si può fare una stringa come 'test\\' senza sfuggire scorso citazione.

+0

La barra in avanti deve essere sottoposta a escape in un'espressione regolare delimitata da '/'. Hai ragione nel senso che il risultato finale è lo stesso, ed è questa stringa che viene passata al codice PCRE. – miken32

+0

Sì, volevo dire che poiché ''\ /'' non valuta nulla di speciale, ha lo stesso effetto di ''\\ /''. Ovviamente questa particolare regex richiede che la barra diretta sia sfuggita, ed entrambi gli esempi lo fanno, ed è per questo che entrambi funzionano (sono gli stessi). –