regular expression problem
cheops
- php
hallo zusammen,
ich habe folgenden string:
[...]
<table width="680" class="xyz">
<tr><td>abcde</td></tr><tr><td>xxxxx</td></tr>
<tr><td>fghij</td></tr><tr><td>yyyyy</td></tr>
</table>
[...]
...dieser table kann innerhalb des strings mehrfach vorkommen (jedoch mit anderen werten innerhalb der zellen... und bevor jemand eine anmerkung schreibt: es MUSS ein table an dieser stelle sein ;-)
jetzt möchte ich exakte diese tabellen aus meinem string herausparsen, sowohl den KOMPLETTEN table-bereich als auch alle einzelnen TRs (variable anzahl) und habe sowas hier versucht:
preg_match_all("(<table.*?(<tr>.*</tr>)</table>)", $content, $loops);
aufgabe #1 wird auch erfüllt, ich erhalte meinen kompletten table-string, jedoch weden meine TRs alle zusammengefasst und nicht gesplittet...
hat jemand eine idee, wie ich es umbauen muss?
danke, gruß und schönes wochenende
marcus
hat jemand eine idee, wie ich es umbauen muss?
think no greedy, denn du kannst es.
mfg Beat;
think no greedy, denn du kannst es.
hi beat,
das mit dem greedy war mir durchaus bewusst, habs aber irgendwie nicht hinbekommen und sitze jetzt schon ewig an diesem ******* problem...
wäre dir also dankbar, wenn du deine hilfe etwas konkretisieren könntest :-)
btw: das mit dem elcappuccino hab ich jetzt nicht geblickt, inwiefern mir das helfen soll?
gruß
marcus
Hi,
das mit dem greedy war mir durchaus bewusst, habs aber irgendwie nicht hinbekommen und sitze jetzt schon ewig an diesem ******* problem...
wäre dir also dankbar, wenn du deine hilfe etwas konkretisieren könntest :-)
(<tr>.*</tr>) auf den String "<tr>bla1</tr><tr>bla2</tr>" ergibt "<tr>bla1</tr><tr>bla2</tr>" während (<tr>.*?</tr>) "<tr>bla1</tr>" ergibt.
btw: das mit dem elcappuccino hab ich jetzt nicht geblickt, inwiefern mir das helfen soll?
Das war auch nicht für die Problemlösung gedacht.
mfG,
steckl
hi steckl,
hmm.... sorry wenn ich nerve, aber irgendwie will es nicht:
preg_match_all("(<table.*?>(<tr>.*?</tr>)</table>)", $content, $loops);
...wenn es sich NUR um einen string mit TRs und TSs handelt, hast du recht und es klappt prima.... ABER inklusive öffnendem und schliessenden table bin ich wieder am anfang meines problem und erhalte nur das was dazwischen steht :-(
ausgangssituatin ist immer noch:
<table width='680'><tr><td>aaaaa</td></tr><tr><td>lorem ipsum #1...</td></tr><tr><td>bbbbbb</td></tr><tr><td>lorem ipsum #2</td></tr></table>
danke und gruß
marcus
Hi,
hi steckl,
hmm.... sorry wenn ich nerve, aber irgendwie will es nicht:
preg_match_all("(<table.*?>(<tr>.*?</tr>)</table>)", $content, $loops);
Was genau willst du machen? Dass der Ausdruck in der inneren Klammer jedes mal genau ein tr-Element matcht?
Momentan suchst du innerhalb der inneren runden Klammern nach einem(!) startenden tr-Tag irgendwas dazwischen (können auch weitere tr-Tags sein) und einem(!) schließenden tr-Tag. Anschließend geht es gleich weiter mit dem schließenden table-Tag.
Du müsstest also deinem RegExp noch sagen, dass der Teil in der Klammer auch mehrfach vorkommen kann. Also musst du danach noch einen * machen.
Ich kenne reguläre Ausdrücke nur von Perl und C++, also weiß ich nicht, was die Funktion preg_match_all genau macht.
Ich bin mir nicht ganz sicher, ob du auf die einzelnen Ergebinsse zugreifen kannst, wenn du hinter die runde Klammer einen * machst.
mfG,
steckl
hmm.... sorry wenn ich nerve, aber irgendwie will es nicht:
preg_match_all("(<table.*?>(<tr>.*?</tr>)</table>)", $content, $loops);
(<tr>.*?</tr>)
Wörtlich: Finde genau ein <tr>....</tr> Container unabhängig dessen, was sich inenrhalb befindet.
Du willst jedoch beliebig viele solche Container finden. Ergo fehlt ein Quantifier.
mfg Beat
Hallo,
preg_match_all("(<table.*?>(<tr>.*?</tr>)+</table>)", $content, $loops);
mfg, Flo
hi flo,
vielen dank für die regex, leider weiterhin nicht das was ich suche.
deine regex liefert den gesamtausdruck und den LETZTEN "<tr></tr>"-block... jedoch nicht beide :-(
gruß
marcus
vielen dank für die regex, leider weiterhin nicht das was ich suche.
deine regex liefert den gesamtausdruck und den LETZTEN "<tr></tr>"-block... jedoch nicht beide :-(
So?
Und was hast du gemacht?
mfg Beat