Perfomance von Regulären Ausdrücken

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

bla
bla

.
.
.

bla
bla
bla

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]*/","");

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

Hallo Sven

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

bla
bla

preg_replace("/[\s\S]*/","");

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 „“ 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Б

Hallo CMS

Wie sieht denn „“ konkret aus?

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Б

Hallo Sven

Wie sieht denn „“ konkret aus?

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
“;
$stuff = file_get_contents(‚officestuff.html‘);
echo "toc
";
$neu = preg_replace(’/.+?MSProjectTemplate_AssignmentTable–>/s’, " ", $stuff );
echo "toc
";
echo $neu;
?>Wie ist der Abstand zwischen den ‚tocs‘?

Grüße

CMБ

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






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

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
\n"; $stuff = file\_get\_contents('office.html'); echo strlen($stuff) . " toc \n"; preg\_match('/MSProjectTemplate\_AssignmentTable--\> (.\*)\z/xs', $stuff, $match); $text = $match[1]; echo strlen($text) . ', ' . strlen($stuff) . " toc \n"; ?\> d.h. einen Match statt eines Replace. In diesen Match könntest Du auch die Suche nach den Tabellen einbauen. Grüße CMБ

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