"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

[PHP] PCRE-Regexp - Probs...

watchout 11.06.2004 - 12:24 704 2
Posts

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Hi leute :)

Jetz steh' ich mal im sand: Ich brauch(hab) für eine art html->xml konvertierung eine regexp, welche mir die freien char-daten in einen <CDATA>-tag packt, ich bin auch schon relativ fertig, leider trifft die regexp nicht auf den fall "</tag1>text</tag2>" zu, und ich weiss nicht warum... :(

als beispiel:
Code:
$t="<tag1>textA<tag2>textB</tag2>textC</tag1>";
$t=preg_replace("/(<[^>]+>)([^<]+)(<[^>]+>)/U",'$1<CDATA>$2</CDATA>$3',$t);
ergibt:
Code:
<tag1><CDATA>textA</CDATA><tag2>textB</tag2><CDATA>textC</CDATA></tag1>
der "textC" sollte aber auch in einem <cdata> verpackt sein, sonst hab ich ein prob mit dem xml-parser...

sieht jemand meinen fehler? :)


ps: ich weiss dass die regexp auch auf <tag>text</tag> zutrifft, das nehm' ich aber in kauf, da sie andernfalls extrem kompliziert werden würde...
pps: das forum macht irgendwas mit der regexp - im anhang is sie nomal im reinformat - oder sie sollte es sein :rolleyes:
regexp_55841.txt (downloaded 78x)
Bearbeitet von watchout am 11.06.2004, 14:09 (solved state)

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
aaalso, mr.zet hat mich da grad auf einen kleinen fehler hingewiesen:
und zwar wird in obigem beispiel nämlich "textB" nicht in die tags eingeschlossen, jedoch, wenn ich folgenden text nehme:
<tag1><tag2>textB</tag2>textC</tag1>

kommt das raus:
<tag1><tag2><CDATA>textB</CDATA></tag2>textC</tag1>

also wenn ich textA weglass...

es wird immer lustiger :rolleyes:

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
aah, problem mit hilfe von mr.zet solved :)

erklärung:
nehmen wir "<tag1>textA<tag2>textB</tag2>textC</tag1>"
der parser matched <tag1>textA<tag2> -> passt
jetzt is der cursor aber schon nach <tag2>, demnach is der nächste match erst wieder bei </tag2>textC</tag1>

das kann man mit einem lookahead lösen, der ja die cursorposition nicht ändert:
"/(<[^>]+>;)([^<]+)(?=<[^>]+>;)/"
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz