Perfomance von Regulären Ausdrücken

Von: , Frage gestellt am Di, 3. Apr 2007

Hallo liebe Experten,

ich habe da ein kleines Problem :

Um eine HTML-Datei zu parsen (Export aus MSProject) will ich alle nutzlosen Daten entfernen. Die Datei sieht etwa wie folgt aus

<body>
bla
bla
<!--interessanter teil-->
<table>
.
.
.
</table>
bla
bla
bla
</body>


Nun möchte ich alles über und unter "interessanter teil" entfernen. Ein einfacher Ausdruck für "drüber" wäre z.B. (als PHP-Code)

preg_replace("/[\\s\\S]*<!--interessanter teil-->/","");

Durch das Suchverhalten der RegEx-Bibliothek dauert das ganze aber bei einer 30KB-Datei ca. 30 Sekunden.
Sieht jemand einen schnelleren Weg ?
Mit Stringfunktionen (pos,replace etc.) ist es zwar signifikant schneller, aber längst nicht so flexibel.

Wäre für jeden Hilfsansatz dankbar.

MfG

SvenOfNine

6 Antworten zu dieser Frage

  1. Antwort von nach 51 Minuten 0 hilfreich
    Re: Perfomance von Regulären Ausdrücken

    Hallo Sven Um eine HTML-Datei zu parsen (Export aus MSProject) will ich
    alle nutzlosen Daten entfernen. Die Datei sieht etwa wie folgt
    aus
    <PREHTML>
    <body>
    bla
    bla
    <!--interessanter teil-->
    ...

    preg_replace("/[\\s\\S]*<!--interessanter teil-->/","");

    Durch das Suchverhalten der RegEx-Bibliothek dauert das ganze
    aber bei einer 30KB-Datei ca. 30 Sekunden.
    Sieht jemand einen schnelleren Weg ?
    Mit Stringfunktionen (pos,replace etc.) ist es zwar
    signifikant schneller, aber längst nicht so flexibel.
    Wie sieht denn "<!--interessanter teil-->" konkret aus?

    Hast Du ein aktuelles Beispiel für <!-- -->?
    Wie oft kommt das vor pro Datei? Was kommt
    sonst noch so vor (Besonderheiten)?

    Grüße

    CMБ

    • Antwort von nach einer Stunde 0 hilfreich
      Re^2: Perfomance von Regulären Ausdrücken

      Hallo CMS Wie sieht denn "<!--interessanter teil-->" konkret aus?

      <!--MSProjectTemplate_AssignmentTable-->
      Wie oft kommt das vor pro Datei? Was kommt
      Kommt nur einmal im Quelltext vor. (Besonderheiten)?
      Eigentlich nicht.Nur ist der Quelltext so wie immer bei M$ total verwurstet.

      Ciao

      SvenOfNine
      Grüße

      CMБ

      • Antwort von nach einer Stunde 0 hilfreich
        Re^3: Perfomance von Regulären Ausdrücken

        Hallo Sven Wie sieht denn "<!--interessanter teil-->" konkret aus?

        <!--MSProjectTemplate_AssignmentTable-->
        Wie oft kommt das vor pro Datei? Was kommt
        Kommt nur einmal im Quelltext vor. (Besonderheiten)?
        Eigentlich nicht.Nur ist der Quelltext so wie immer bei M$
        total verwurstet.
        In Abhängigkeit davon, was Du genau vorhast
        (kannst Du das beschreiben?), könnte man sogar
        nochmal weiter überlegen.

        Wie verhält sich denn sowas? ==> <?php
        echo "toc<br />";
        $stuff = file_get_contents('officestuff.html');
        echo "toc<br />";
        $neu = preg_replace('/.+?MSProjectTemplate_AssignmentTable-->/s', " ", $stuff );
        echo "toc<br />";
        echo $neu;
        ?>
        Wie ist der Abstand zwischen den 'tocs'?

        Grüße

        CMБ

        • Antwort von nach 4 Stunden 0 hilfreich
          Re^4: Perfomance von Regulären Ausdrücken

          In Abhängigkeit davon, was Du genau vorhast
          (kannst Du das beschreiben?), könnte man sogar
          nochmal weiter überlegen.
          Ich möchte einfach aus der html-Datei alles Unnötige entfernen, um die überbleibende Tabellenkonstruktion problemlos parsen zu können.
          Also aus

          <html>
          ..
          ..
          ..
          <!--MSProjectTemplate_AssignmentTable-->
          <TABLE>
          ..
          ..
          ..
          </TABLE>
          ..
          ..
          </HTML>

          alles zwischen den Tabletags rausziehen. Leider enthält die Datei weitere Tabellen, so daß ich es eingrenzen muß. Dies funktioniert (aus meiner Sicht) am Besten mit dem "MSProjectTemplate_AssignmentTable" -Kommentar. Wie verhält sich denn sowas? ==>
          preg_replace('/.+?MSProjectTemplate_AssignmentTable-->/s',"");

          Läuft leider genausolange.
          Das Problem ist wohl, daß wenn ich mit greedy suche die kpl. Datei erkannt wird und danach Rückwärts bis zu <!--...--> gelaufen wird. Dadurch erhöht sich die Suchzeit sehr stark.
          Ohne greedy muß jedesmal kpl. mit <!--...--> verglichen werden, wodurch sich die Zeit nätürlich auch extrem verlängert.

          Ciao
          Sven-of-Nine

          • Antwort von nach 5 Stunden 0 hilfreich
            Re^5: Perfomance von Regulären Ausdrücken

            Hallo Sven, Ich möchte einfach aus der html-Datei alles Unnötige
            entfernen, um die überbleibende Tabellenkonstruktion
            problemlos parsen zu können.
            ... alles zwischen den Tabletags rausziehen. Leider
            enthält die Datei weitere Tabellen, so daß ich es eingrenzen muß.
            Dies funktioniert (aus meiner Sicht) am Besten mit dem
            "MSProjectTemplate_AssignmentTable" -Kommentar.
            ... Wie verhält sich denn sowas? ==>
            preg_replace('/.+?MSProjectTemplate_AssignmentTable-->/s',"");

            Läuft leider genausolange.
            OK, was ist das denn für ein Server? Das Problem ist wohl, daß wenn ich mit greedy suche die kpl.
            Datei erkannt wird und danach Rückwärts bis zu
            <!--...--> gelaufen wird. Dadurch erhöht sich die
            Suchzeit sehr stark.
            Ohne greedy muß jedesmal kpl. mit <!--...--> verglichen
            werden, wodurch sich die Zeit nätürlich auch extrem
            verlängert.
            Ohne 'greedy' sucht (imho) die PCRE-NFA von PHP
            einfach den String 'MSProjectTemplate_AssignmentTable'
            und sonst nichts (dachte ich).

            Ich vermute, es liegt hier eine Beschränkung
            des PHP-Replace vor. Versuch doch mal "andersrum":

            <?php
            echo "toc<br />\n";

            $stuff = file_get_contents('office.html');
            echo strlen($stuff) . " toc<br />\n";

            preg_match('/MSProjectTemplate_AssignmentTable--> (.*)\z/xs', $stuff, $match);
            $text = $match[1];
            echo strlen($text) . ', ' . strlen($stuff) . " toc<br />\n";
            ?>

            d.h. einen Match statt eines Replace. In
            diesen Match könntest Du auch die Suche
            nach den Tabellen einbauen.

            Grüße

            CMБ

            • Antwort von nach 21 Stunden 0 hilfreich
              Re^6: Perfomance von Regulären Ausdrücken

              OK, was ist das denn für ein Server?
              Ist egal.
              unter debian / windows /php4 /php5 verhält es sich quasi identisch

              preg_match('/MSProjectTemplate_AssignmentTable-->...

              So funktioniert es viel schneller.
              Vielen Dank für Deine Hilfe. Das hilft mir schon viel weiter.

              MfG

              SvenOfNine

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!