patrick: Reguläre Ausdrücke

Hallo Gemeinde,

ich möchte gerne alles was zwischen zwei table-tags steht löschen. Dazu habe ich den folgenden Code verwendet:

$value = preg_replace( "/<table[^>]*</table>/", "", $value );

Er nimmt jetzt zwar das <table>-tag heraus, aber nicht das was danach bis zum </table>-Tag kommt. Wie muss ich das ganze erweitern?

Danke schon im voraus...

Gruss

Patrick

  1. Hallo du da draußen,

    $value = preg_replace( "/<table[^>]*</table>/", "", $value );
    Er nimmt jetzt zwar das <table>-tag heraus, aber nicht das was danach bis zum </table>-Tag kommt. Wie muss ich das ganze erweitern?

    Also: Wenn ich das richtig sehe, sucht dieses Konstrukt nach dem String "<table", und wenn danach beliebig viele Zeichen außer > kommen und dann </table>, ersetzt er es durch nichts. Das funktioniert in sofern schon mal nicht, da ja nach <table wohl noch irgendwo ein > kommt, was du aber ausschließt.

    Willst du nun das Table-Tag _und_ das was dazwischen steht löschen willst, musst du den regulären Ausdruck nur ein wenig ändern:
    /<table[^>]*>.*</table>/

    Willst du allerdings nur das, was dazwischen steht, löschen, und die Table-Tags dalassen, sieht es so aus:
    $value = preg_replace("/(<table[^>]*>).*(</table>)/", "\1\2", $value);

    Erläuterung: Für jeden in einer Klammer stehenden Ausdruck wird ein Platzhalter angelegt. Für die Klammer (<table[^>]*>) heißt der Platzhalter \1, für (</table>) \2 usw. Falls es dich noch interessiert, steht \0 für den gesamten Ausdruck.

    Jetzt fällt mir aber doch glatt was auf: Meine Lösung stimmt auch noch nicht ganz: Sind mehrere Table-Konstrukte in $value, löscht er den String vom allerersten <table>-Tag bis zum allerletzten </table>-Tag und nicht das zwischen den Table-Tags... Hat jemand eine Idee, wie man das korrigieren könnte? (Mit regulären Ausdrücken, ohne wäre es halt kompliziert...)

    Grüße von hier drinnen, aus Biberach an der Riss (http://www.stadt-biberach.de/),
    Candid Dauth (Dogfish)

    PS: Ich hoffe, dass ich jetzt keinen Müll erzählt habe ;-)

    --
    Selten Dumme sind nicht selten, aber dumm.
    http://dogfish.net.tc/
    1. Hallo du da draußen,

      Hi,

      $value = preg_replace("/(<table[^>]*>).*(</table>)/", "\1\2", $value);

      wenn mich nicht alles täuscht, dann muss es \1\2 heißen - aber da hilft jetzt nur testen!

      Jetzt fällt mir aber doch glatt was auf: Meine Lösung stimmt auch noch nicht ganz: Sind mehrere Table-Konstrukte in $value, löscht er den String vom allerersten <table>-Tag bis zum allerletzten </table>-Tag und nicht das zwischen den Table-Tags... Hat jemand eine Idee, wie man das korrigieren könnte? (Mit regulären Ausdrücken, ohne wäre es halt kompliziert...)

      Dazu musst du den *-Operator ungierig machen. Das machst du, in dem du ein ? hinten ran stellst, also: "*?".
      Alles in allem sollte der Ausdrück dann so aussehen:

      $value = preg_replace("/(<table[^>]*>).*?(</table>)/", "\1\2", $value);

      Aber da ich das nicht testen kann, musst du das wohl übernehmen!

      Thats all Folks
       eb4