Felix Riesterer: Problem mit ereg_replace

Beitrag lesen

Lieber philippo,

du hast wahrscheinlich ein Problem mit einem "gierigen" Ausdruck!

ich habe folgende Regulären Ausdruck

"<!-- td>.+</td>"

Also hier sehe ich _noch_ kein Problem.

mit dem ich mittels ereg_replace folgeden Text ersetze:

<!-- td>2<td -->
  <td>Text1</td>

blablabla

<!-- td>1<td -->
  <td>Text567</td>

text,text,text

<!-- td>2<td -->
  <td>Text1</td>

hampelpampel

Jetzt sehe ich das Problem: Alles ab dem ersten <!-- td> bis hin zum allerletzten </td> wird auf Deinen Ausdruck gematched, denn Dein ".+" im Ausdruck verbietet ja nicht, dass sozusagen mittendrin auch ein </td> vorkommt... Klar, was ich meine?

Nun möchte ich immer die beiden "td" Zeilen "weghaben".

Dann sollte Dein Ausdruck ganz gezielt zuerst nach einem HTML-Kommentar suchen, und danach nach einer Tabellenzelle (TD-Tag).

Ich schreibe jetzt mal einen ungeprüften Entwurf zu einem solchen Muster:
"/(?is)<!--(?:.(?!-->))+-->[ \t\r\n]*<td>(?:.(?!</td>))+</td>/"

Erklärung: Zuerst suche ich "<!--", da das den Kommentar einleitet. Danach suche ich Zeichen, denen _keine_ Sequenz á la "-->" folgt. Dazu nehme ich eine Klammer, die er sich nicht merken soll (daher "?:"), in die ich einen Punkt (für beliebiges Zeichen) setze, dem in einer neuen Klammer ein "negative lookahead" folgt, also eine Vorausschau, die nicht passen darf. In dem Lookahead steht eben das Ende des Kommentars, das ja nicht "übersprungen" werden darf. Das so (mit Lookahead) definierte Zeichen darf öfters vorkommen, daher nach der verschachtelten Klammer das Pluszeichen.

In den eckigen Klammern suche ich nach Leerzeichen, Tabs und Zeilenumbrüchen, die in Deinem Textbeispiel enthalten sein könnten, die er aber mit ersetzen muss. Für die "echte" Tabellenzelle kommt das gleiche Spiel eben nocheinmal.

Liebe Grüße aus Ellwangen,

Felix Riesterer.