2012-04-18 8 views
9

Nach dem Lesen von this article über zwei verschiedene Arten von regulären Ausdruck Algorithmen (Perl 5.8.7 und Thompson NFA), der letzte ~ 1.000.000 mal schneller als der frühere, nach dem Artikel. Ich benutze PHP täglich und benutze Regex ziemlich viel, also wollte ich wissen, welchen Algorithmus PHP benutzt.Welchen regulären Ausdruck Algorithmus verwendet PHP?

Ich fand this question, aber es ist nur für JavaScript. Eine der Antworten besagt, dass JavaScript den Thompson NFA-Algorithmus verwendet, aber das wird natürlich von Implementierung zu Implementierung variieren. Ich denke, dass PHP möglicherweise auf die Verwendung der schnelleren Algorithmen umgestellt hat, als es zu seiner PCRE Reihe von Funktionen wechselte, die ereg_* Sachen verwarf.

Ich habe mir die PHP PCRE documentation angesehen und, soweit ich sehen konnte, sagt es mir nichts darüber, welchen Algorithmus es verwendet. Das Akronym PCRE sagt mir, dass es Perl Compatible Regular Expressions verwendet, also nehme ich an, dass es den Perl-Stil-Algorithmus verwendet.

Welchen regulären Ausdruck Algorithmus verwendet PHP? Ist es "Perl 5.8.7 style", oder verwendet es den viel schnelleren Thompson NFA-Algorithmus oder einen anderen vollständig? Könnte es sogar ein Perl-Backend verwenden, um seine Ausdrücke auszuführen?

Wenn PHP tut einen Perl-Stil-Algorithmus verwenden, was genau ist es? Ich suche nach einer abstrakten Definition/Erklärung in Bezug auf andere Algorithmen.

+2

Sie haben Recht, PCRE steht für Perl-kompatible reguläre Ausdrücke. Das ist jedoch kein Algorithmus. – BoltClock

+2

PCRE bedeutet normalerweise die [pcre-Bibliothek] (http://en.wikipedia.org/wiki/Pcre), die jedoch die rückstellenden Perl-ähnlichen Algorithmen verwendet. IIRC Der NFA-Ansatz sieht nur große Leistungssteigerungen für typische Arten von Abfragen in großen Datenmengen. 1.000.000 Mal ist eine dramatische Übertreibung für typische Anwendungen. – Dougal

+1

Beachten Sie, dass der Autor dieses Artikels eine Bibliothek mit dem Namen ['re2'] (http://code.google.com/p/re2/) implementiert hat, die traditionelle reguläre Ausdrücke verwendet und daher bei bestimmten Eingaben schneller ist, besonders bei großen . ['php-re2'] (https://github.com/arraypad/php-re2) ist eine Reihe von PHP-Bindings zu' re2'; Ich habe keine Ahnung, ob es gut ist. – Dougal

Antwort

5

Aus dem Handbuch:

http://www.php.net/pcre:

Regular Expressions (Perl-Compatible)

http://www.php.net/manual/en/intro.pcre.php:

Die PCRE-Bibliothek ist ein Satz von Funktionen, die implementieren t regulär Ausdruck Muster mit der gleichen Syntax und Semantik wie Perl 5, mit nur ein paar Unterschiede (siehe unten). Die aktuelle Implementierung entspricht Perl 5.005.