[RegExp] Komplexes Problem

Black-Horse

Well-known member
ID: 82692
L
3 Mai 2006
326
18
Hallo,

ich habe ein komplexes Problem mit einem Regulären Ausdruck. Ich habe folgenden String

<tag>
hier steht irgendetwas
<tag>
hier steht noch viel mehr
</tag>
hier auch noch
<tag>
<tag>
hier kann auch ncoh was hin
</tag>
hier auch
</tag>
</tag>

so ich möchte diesen string jetzt n-mal durchgehen, bis ich alle Tags gefunden habe, die zusammen gehören. ich möchte dabei immer die tiefsten element herraussuchen und diese nach einem jeweiligen durchluaf ersetzen.
Von der logik her ist es auch cniht schwer :

1. suche TAG "<tag>"
2. suche TAG "</tag>", wenn sich zwischen <tag> und </tag> kein weiteres <tag> befindet.

ansich nicht schwer, das probelm ist, dass man bei regExp keine Strings ausschließen kann. ich habe zwar eine psyeudo möglichkeit gefunden, jedoch funktioniert die nur bei zeilenweise einlesen mit den begenzern \A und \Z.
kann mir irgendwer helfen?
 
Black-Horse schrieb:
So ich möchte diesen string jetzt n-mal durchgehen, bis ich alle Tags gefunden habe, die zusammen gehören. ich möchte dabei immer die tiefsten element herraussuchen und diese nach einem jeweiligen durchluaf ersetzen.
Ich glaube, du wärst du mit dem XML-Parser von PHP besser dran :think:

Probier mal den:
Code:
/<tag>(.*?)<\/tag>/
Ob du damit den innerliegensten Tag erwischt, weiß ich ned. Das ? müsste eigentlich dafür sorgen, aber probiers einfach mal aus.
 
Ich glaube, mit dem XML-Parser würde man auch nicht weit kommen, da der Aufbau dafür nicht XML-konform genug ist. Ich mag mich täuschen, aber soweit ich mich entsinne, erlaubt XML keine gemischten Knoten, sprich: <a> b <c> d </c> </a>.
Entweder hat ein Knoten einen weiteren Knoten als Inhalt oder Daten, aber nicht gemischt. Aber wie gesagt, mag sein, dass ich mich vertue, da XHTML ja im Endeffekt auch valides XML sein sollte...

Und zu theHackers Ansatz:

Ich würde genau den anderen Ansatz nehmen. Du machst das Capturen "ungierig", was aber zu Fehlverhalten führen dürfte. Der Ausdruck nimmt den ersten öffnenden Tag und schliesst schon beim ersten (und somit innersten) schliessenden Tag. Das wäre falsch. Ich würde auf den ganzen String solange gierige Ausdrücke anwenden, bis nichts mehr gefunden wird. Dadurch wird sichergestellt, dass immer die entsprechenden Tags einander zugeordnet werden. Aber wie gesagt, das ist nur ein Ansatz. Bei zwei Knoten auf gleicher Ebene müsste der Ausdruck nämlich wieder "ungierig" sein.
 
Zuletzt bearbeitet:
tleilax schrieb:
Entweder hat ein Knoten einen weiteren Knoten als Inhalt oder Daten, aber nicht gemischt. Aber wie gesagt, mag sein, dass ich mich vertue, da XHTML ja im Endeffekt auch valides XML sein sollte...
Das glaube ich auch. RSS-Feeds können doch afaik auch HTML beinhalten und sind selber aber valides XML. *mich mit RSS noch weniger auskenn*
tleilax schrieb:
Bei zwei Knoten auf gleicher Ebene müsste der Ausdruck nämlich wieder "ungierig" sein.
Drum war ich mir eben unsicher, ob es funktioniert.
 
theHacker schrieb:
Code:
/<tag>(.*?)<\/tag>/

das war natürlich auch meine erste idee, aber leider funktioniert das nicht, weil es ab dem nächsten geschlossenen </tag> nen problem gibt, wenn kein <tag> davor ist, ich könnte zwar meinen bisherigen ausdruck posten, aber das würde den rahmen sprengen. ich suche da leider auch schon ne weile dran