Reguläre Ausdrücke
patrick
- php
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
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 ;-)
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