2009-01-27 9 views

Antwort

6

Es gibt keinen technischen Grund, warum es so sein muss.

Wie in einem Kommentar erwähnt, erfordert die zugrunde liegende Bibliothek nicht, dass Flags als Teil der Regexp übergeben werden - tatsächlich muss die Erweiterung diese streichen und sie als separates Argument übergeben.

Es sieht so aus, als ob der ursprüngliche Implementierer versucht hat, es wie grep/sed/awk/perl/etc aussehen zu lassen, damit es Programmierern, die von diesen Tools kommen, vertrauter ist.

+4

PCRE lässt die umgebenden Begrenzer überhaupt nicht zu. Die PHP-Preg-Funktionen streichen sie aus, bevor sie an die PCRE-Bibliothek übergeben werden. –

+2

wow, dann ist das alles nur ein Versuch, Perl zu sein? Ich habe die Syntax seit Jahren verzeihen, aber jetzt kann ich es wirklich hassen. Vielen Dank! – Cal

+0

Diese Antwort ist gut für die persönliche Meinung, aber es ist nicht korrekt. – dreftymac

15

Der Grund für das Trennzeichen ist das Setzen von Flags nach dem Muster. Eventuell können Flags als separater Parameter übergeben werden (Java kann das auch), aber so hat es Perl ursprünglich gemacht (und sed/awk/vi davor), so wie es jetzt gemacht wird.

Verwenden Sie keine Schrägstriche: Sie sind zu häufig. Persönlich benutze ich fast immer das! Charakter. Ich suche kaum danach.

+1

Hinweis: Java kann auch Flags innerhalb des Regexp enthalten, zu Beginn (? M) zum Beispiel für mehrere Zeilen. (? s) für dotall, (? ms) für beide und so weiter. – VonC

+0

@VonC, so kann Python. –

+0

So können Perl, PCRE und sogar PHP's Preg funktionieren. Aber die Preg-Funktionen haben einige zusätzliche Flags, die nur nach der Regex angegeben werden können. –

6

Ich weiß nicht, was die Motive der Entwickler der Preg-Funktionen waren. Der einzige Grund, an den ich denken kann, ist, dass sie etwas zu hart versuchten, Dinge auf Perl-Art zu machen.

Während die Trennzeichen ermöglichen Flags zusammen mit der Regex als ein Parameter angegeben werden, ist die Angabe der Flags als separater Parameter viel sauberer. Das ist, wie jede andere Bibliothek für reguläre Ausdrücke (für Sprachen, die keine literalen Regexes als Sprachfunktion unterstützen), weiß ich es, einschließlich der PCRE-Bibliothek, auf der die Preg-Funktionen von PHP basieren. Der Preg-Code muss in der Tat die Mühe machen, die Regex-Begrenzer aus der Zeichenkette mit Ihrer Regex zu entfernen, bevor er an PCRE übergeben werden kann.