Innersten Tag mit RegExps matchen

con-f-use

Erfahrenes Mitglied
Hallo zusammen,

ich brauche einen regulären Ausdruck, der aus einer XML-Datei den innersten Tag einer bestimmten Art und seinen inhalt (können auch noch weitere Tags sein) matcht.

Beispiel:
Code:
<bla>
    <blubb>Inhalt</blubb>
    <foo> 
        <bar>
            <foo>
                <bar>Inhalt<bar>
                <blubb>Inhalt</blubb>
             </foo>
        </bar>
    </foo>
    <foo>Inhalt</foo>
</bla>

Der blaue Teil soll gematcht werden.

Schonmal Danke für eure Hilfe und

G-r-uß von,
con-f-use
 
vielleicht:
Code:
 '#<foo>\s+(<bar>(.+)</bar>)\s+(<blubb>(.+)</blubb>)\s+</foo>#iU' 
oder
 '#<foo>\s*(<bar>(.*?)</bar>)\s*(<blubb>(.*?)</blubb>)\s*</foo>#i'
 
Das ist nicht, was ich wollte, trotzdem Danke. Der Inhalt des innersten <foo></foo>, das ich matchen will ist völlig variabel, d.h. es steht nich immer ein genau ein <bar>-Tag mit Inalt und ein <blubb>-Tag mit Inhalt drin, sondern einfach irgentetwas - kann ein Textnode sein, können aber auch mehrere andere Tags mit Inhalt oder ohne Inhalt und Attributen sein sein.
 
Nein, foo bleibt foo, kann aber variable attribute haben. Es geht eben darum die foo-Tags zu matchen, die in keinen anderen foo-Tags mehr drinstecken.
 
Die XML-Funktionen sind nicht so toll, da ich mir erstens nicht 100% sicher sein kann, dass die xml-Dateien auch 100%ig valide sind und bei invaliden Dokumenten das XML gar nicht erst läd, ich zweitens das Ganze schon als String vorliegen haben und es auch als String weiter verarbeiten will und drittens die XML-Funktionen unnötig viel Code erzeugen und vergleichsweise langsam sind.

Was deinen RegExp von eben angeht: So habe ich es auch schon probiert. Das würde zu viel matchen, namlich auch den Rot markierten Teil:
Code:
<bla>
    <blubb>Inhalt</blubb>
    <foo> 
        <bar>
            <foo>
                <bar>Inhalt<bar>
                <blubb>Inhalt</blubb>
             </foo>
        </bar>
    </foo>
    <foo>Inhalt</foo>
</bla>
 
Zuletzt bearbeitet:
Leider wieder nichts, das verlässt sich auf die white-Spaces, aber der ganze Text könnte auch in einer Zeile sein. Außerdem können die Tags in dem gestuchten <foo></foo> beliebig viele und beliebig verschachtelt sein.

Es müsste halt sowas geben wie, finde alle Strings, die auf <foo.*> anfangen, mit </foo> enden und bei denen dazwischen alles vorkommen kann, nur kein <foo.*>.*</foo> mehr.

Das muss doch ohne schleifen und große Code-Eskapaden mit einem einzelnen RegExp gehen, verdammt.

Aber es freut mich, das andere damit auch Probleme haben.

Habe auch schon ein wenig mit Assertationen (Look-aheads und Look-behinds) herumgespielt. Dachte mir so müsste es gehen, aber das hat auch wieder zu viel gematcht:
Code:
       '#<foo.*>.*(?!<foo).*(?<!</foo>).*</foo>#isU'
 
Zuletzt bearbeitet:
> das verlässt sich auf die white-Spaces

Hmm, deswegen ja (\s+)? sprich: kann mehrmals vorkommen, muss aber nicht :-)

> Aber es freut mich, das andere damit auch Probleme haben

Naja, so intensiv habe ich das noch nicht versucht.
 
Zurück