2015-11-25 10 views
6

Ich versuche, 008/Preg Spiel Slashes

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

Meine Frage zu entsprechen ist, warum tun beide der regulären Ausdrücken arbeiten. Ich würde erwarten, dass die zweite funktioniert, aber warum funktioniert der doppelte Backslash?

+0

Das Beispiel in Ihrer Frage versucht, einen Schrägstrich und keinen umgekehrten Schrägstrich zu finden. – Barmar

+0

Nur für den Fall, dass Sie nicht wussten, ist das '/' als Trennzeichen völlig willkürlich. Wenn ich nach Dingen suche, die einen Schrägstrich enthalten, mache ich oft etwas wie 'preg_match ('# 008/#', $ string, $ matches)', damit ich die Flucht vermeiden kann. – miken32

Antwort

5

Da \\ in PHP-Strings bedeutet "Flüchten Sie den Backslash". Da \/ nichts bedeutet, muss es nicht maskiert werden (obwohl es möglich ist), also bewerten sie dasselbe.

Mit anderen Worten, diese beiden die gleiche Sache drucken:

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

Der Backslash ist one of the few characters that can get escaped in a single quoted string (abgesehen von dem offensichtlichen \'), die dafür sorgt, dass Sie das letzte Mal eine Zeichenfolge wie 'test\\' ohne Flucht machen können Zitat.

+0

Der Forward-Schrägstrich muss in einem regulären Ausdruck, der durch '/' zwar begrenzt ist, maskiert werden. Du hast Recht, dass das Endergebnis das gleiche ist, und es ist diese Zeichenfolge, die an den PCRE-Code übergeben wird. – miken32

+0

Ja, ich meinte, dass '' \/'' nicht zu etwas Besonderem ausgewertet wird, es hat den gleichen Effekt wie '\\/''. Offensichtlich erfordert diese spezielle Regex, dass der Schrägstrich verworfen wird, und beide Beispiele tun das, weshalb beide funktionieren (sie sind gleich). –