Seite 1 von 1

regexp vs. catcat

Verfasst: 16.05.2011, 14:26
von catcat
Bis jetzt steht es so ca. 50:0.

Wie lösche ich mit regexp alles zwischen einem <table> und einem </table> raus?
Ich hab schon so viele Fragezeichen, Sternchen und komische Klammern versucht, aber irgendwie...

Verfasst:
von

Verfasst: 16.05.2011, 14:44
von webtechnixx
Hallo, versuchs doch mal damit:

Code: Alles auswählen

$regex_pattern = '/<table>&#40;.*&#41;<\/table>/iUms';
preg_match&#40;$regex_pattern, $zufilternderinhalt, $ergebniss&#41;;
$result = str_replace&#40;"'",'"',$ergebniss&#91;1&#93;&#41;;

Verfasst: 16.05.2011, 14:46
von vipa
Wichtig ist in so einem Fall, Regex auf "ungreedy" zu stellen, sonst löscht er alles zwischen der ersten und letzten Tabelle :-)

Verfasst: 16.05.2011, 14:51
von Synonym
Wobei das allgemein etwas schwieriger werden dürfte. Was ist, wenn eine Tabelle in der Tabelle ist, dann löscht der aus beiden einen Teil und es kommt Chaos raus ;-)

Verfasst: 16.05.2011, 18:38
von net(t)worker
wie is der aktuelle Stand?

Verfasst: 16.05.2011, 19:10
von Kassandra70
@Synonym
das kannst du mit durchzählen (substr_count) abfangen. So habe ich es zumindest mal gelöst.

Verfasst: 16.05.2011, 20:47
von catcat
Öh... ich hab ne CSV mit Produktdaten drinne. So über 1000 Produkte mit gut 15.5k Zeilen.
Und da ist immer in jedem Produkt ne Tabelle reingefriemelt worden, die ich jetzt aber raus haben will.
Es ist also keine tabelle in anderen tabellen da: Die sind alle schön hintereinander.

Und jetzt such ich mal, was "ungreedy" wohl sein mag :oops:

Verfasst: 16.05.2011, 20:59
von profo
Ooch, ist leider nur einen Einzeiler wert :-(

Nimmst Du perl per Kommandozeile:

Code: Alles auswählen

perl -pe 's/<table>.*?<\/table>//i' schrott.csv > schoen.csv
Im "greedy" mode nimmt Perl das längstmögliche passende Ergebnis. Mit einem "nicht greedy" (einfach ein Fragezeichen an den Stern anhängen) nimmt Perl das kürzestmögliche passende Ergebnis.

Verfasst: 16.05.2011, 21:02
von net(t)worker
catcat hat geschrieben:Und jetzt such ich mal, was "ungreedy" wohl sein mag :oops:
greedy bedeutet "hungrig", also das ein regulärer Ausdruck immer so viel wie möglich erfasst, während ungreedy eben das Gegenteil bedeutet, das eben der erfasste Teil so klein wie möglich ist....

wenn es jeweils nur 1 Tabelle gibt, ist es egal, da hier ja kleinst- und größtmögliche Ergebnis identisch ist...

wie sieht denn so ein Datensatz in etwa aus, und wie willst du ihn haben...

Aber trotzdem müssen wir dann wissen wieviele Anläufe du nach dem 50:0 noch gebracht hast, wir müssen die Wette ja irgendwann auch auflösen können... :roll:

Verfasst: 16.05.2011, 21:11
von net(t)worker
profo hat geschrieben:

Code: Alles auswählen

perl -pe 's/<table>.*?<\/table>//i' schrott.csv > schoen.csv
ich glaube das hast du nicht ganz zuende gedacht... das ergibt doch nur das was sich innerhalb der Table befindet, alle anderen Felder im csv sind auch mit weg....

Verfasst: 16.05.2011, 21:13
von profo
net(t)worker hat geschrieben:
profo hat geschrieben:

Code: Alles auswählen

perl -pe 's/<table>.*?<\/table>//i' schrott.csv > schoen.csv
ich glaube das hast du nicht ganz zuende gedacht... das ergibt doch nur das was sich innerhalb der Table befindet, alle anderen Felder im csv sind auch mit weg....
Nee, ist praktisch ausprobiert und sollte demnach eigentlich funktionieren. Das "s/" ist doch das "substitute"; damit wird also der gefundener Code-Teil gelöscht. Der Rest liegt in der "-p" - Magie von Perl :)

PS: falls die table-Dinger über mehrere Zeilen gehen, funktioniert der obige Code nicht. Dann müsste es so heißen:

Code: Alles auswählen

perl -e 'local $/; $_=<>; s/<table>.*?<\/table>//isg; print' schrott.csv > schoen.csv