Regex in PHP kompilieren

Lesezeit: 4 Minuten

Gibt es in PHP eine Möglichkeit, einen regulären Ausdruck zu kompilieren, sodass er dann mit mehreren Zeichenfolgen verglichen werden kann, ohne den Kompilierungsprozess zu wiederholen? Andere wichtige Sprachen können dies tun – Java, C#, Python, Javascript usw.

Die Bibliothek mit Perl-kompatiblen regulären Ausdrücken wurde möglicherweise bereits für Ihren Anwendungsfall optimiert, ohne eine Regex-Klasse bereitzustellen, wie dies andere Sprachen tun:

Diese Erweiterung verwaltet einen globalen Thread-Cache mit kompilierten regulären Ausdrücken (bis zu 4096).

PCRE-Einführung

Auf diese Weise kann der von Imran beschriebene Studienmodifikator den kompilierten Ausdruck zwischen Aufrufen speichern.

  • Kann ich die Größe des Thread-Cache erhöhen und was bedeutet 4096

    – sagar junnarkar

    11. September 2013 um 5:07 Uhr

  • Ich denke, es bedeutet 4096 kompilierte Regexes.

    – Tobi

    28. September 2016 um 14:16 Uhr

preg Regexes können den Modifikator S (Studie) in Großbuchstaben verwenden, was wahrscheinlich das ist, wonach Sie suchen.

http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

S

Wenn ein Muster mehrmals verwendet wird, lohnt es sich, mehr Zeit für die Analyse aufzuwenden, um die Zeit für den Abgleich zu verkürzen. Wenn dieser Modifikator gesetzt ist, wird diese zusätzliche Analyse durchgeführt. Derzeit ist das Studium eines Musters nur für nicht verankerte Muster nützlich, die kein einzelnes festes Anfangszeichen haben.

  • Die Antwort auf die Frage des OP lautet, dass Regexes in PHP nicht vorkompiliert werden müssen, da, wie 1stvamp feststellte, kompilierte Regexes automatisch zwischengespeichert werden. Der ‘S’-Modifikator ist ein separates Problem.

    – Alan Moore

    7. April 2009 um 3:39 Uhr

  • Diese Antwort wurde den häufig gestellten Fragen zu regulären Ausdrücken zu Stapelüberläufen unter “Modifikatoren” hinzugefügt.

    – aliteralmind

    10. April 2014 um 0:41 Uhr

Thread ist der Thread, in dem das Skript derzeit ausgeführt wird. Nach der ersten Verwendung wird der kompilierte reguläre Ausdruck zwischengespeichert und bei der nächsten Verwendung von PHP nicht erneut kompiliert.

Einfacher Test:

<?php

function microtime_float() {
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}

// test string
$text="The big brown <b>fox</b> jumped over a lazy <b>cat</b>";
$testTimes=10;


$avg=0;
for ($x=0; $x<$testTimes; $x++)
{
    $start=microtime_float();
    for ($i=0; $i<10000; $i++) {
        preg_match_all('/<b>(.*)<\/b>0?/', $text, $m);
    }
    $end=microtime_float();
    $avg += (float)$end-$start;
}

echo 'Regexp with caching avg '.($avg/$testTimes);

// regexp without caching
$avg=0;
for ($x=0; $x<$testTimes; $x++)
{
    $start=microtime_float();
    for ($i=0; $i<10000; $i++) {
        $pattern='/<b>(.*)<\/b>'.$i.'?/';
        preg_match_all($pattern, $text, $m);
    }
    $end=microtime_float();
    $avg += (float)$end-$start;
}

echo '<br/>Regexp without caching avg '.($avg/$testTimes);

Regexp mit Caching avg 0.1 Regexp ohne Caching avg 0.8

Das Zwischenspeichern eines Regexp macht es 8-mal schneller!

  • Test ist NUL! Denn: Sie verketten in Ihrem 2. Beispiel 3 Zeichenfolgen (ohne Caching), während Sie im 1. die ‘Variable’ $i existiert nicht im Muster und es ist immer 0 an diesem Ort

    – CSᵠ

    8. November 2014 um 3:38 Uhr


  • Prüfung ist halbwegs gültig dennoch. Durch Verketten einer Zeichenfolge “$j-$y” mit $j = 37 und $y = 5 im ersten Test und einer Zeichenfolge “$i-$x” im zweiten (das -$x dient dazu, jegliches Caching von zu unterbinden testTimes), erhalte ich Zeiten von 0,0112 und 0,0431. Die gleichen 0,0431 werden durch die Verwendung von “$i-$y” im zweiten Test erhalten, was bedeutet, dass der Cache tatsächlich weniger als 10000 groß ist. Meine eigentliche Beschleunigung ist also 4 mal schneller (nicht 8).

    – LSerni

    29. Oktober 2015 um 8:44 Uhr

Wie ein anderer Kommentator bereits gesagt hat, sind PCRE-Regexes bereits kompiliert, ohne dass Sie sie als solche spezifisch referenzieren müssen. PCRE behält einen internen Hash, der durch die von Ihnen bereitgestellte Originalzeichenfolge indiziert ist.

Benutzer-Avatar
EBGrün

Ich bin mir nicht sicher, ob Sie das können. Wenn Sie Reguläre Ausdrücke meistern lesen, werden einige PHP-spezifische Optimierungstechniken in Kapitel 10: PHP besprochen. Insbesondere die Verwendung des S-Mustermodifikators, um die Regex-Engine zu veranlassen, den regulären Ausdruck zu „studieren“, bevor sie ihn anwendet. Abhängig von Ihrem Muster und Ihrem Text könnte dies Ihnen einige Geschwindigkeitsverbesserungen bringen.

Bearbeiten: Mit können Sie einen Blick auf den Inhalt des Buches werfen books.google.com.

  • Jeder Entwickler, der Regex verwendet, sollte dieses Buch lesen !! Alle Techniken, die Sie brauchen, um effizient zu sein, finden Sie in diesem Buch.

    – Arno

    8. Dezember 2009 um 14:35 Uhr

  • Jeder Entwickler, der Regex verwendet, sollte dieses Buch lesen !! Alle Techniken, die Sie brauchen, um effizient zu sein, finden Sie in diesem Buch.

    – Arno

    8. Dezember 2009 um 14:35 Uhr

1330240cookie-checkRegex in PHP kompilieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy