nntp2http.com
Posting
Suche
Optionen
Hilfe & Kontakt

rekursives pattern matching mit negation von zeichenfolgen

Von: Johannes Mueller (johannes_m@gmx.net) [Profil]
Datum: 01.11.2009 17:43
Message-ID: <7l5s6dF3cqitfU1@mid.uni-berlin.de>
Newsgroup: de.comp.lang.php.misc
Hallo allerseits,

ich habe eine verschachtelte Konstruktion in der Art:

$string = '{{ Foo foo1={1} foo2= {{ Bar bar= {{ Baz baz=3 }} {{
Faz }} }} }}';

aus der ich gern folgendes machen würde:

<Foo>
<foo1>{1}</foo1>
<foo2>
<Bar>
<bar>
<Baz>
<baz>3</baz>
</Baz>
<Faz>
</Faz>
</bar>
</Bar>
</foo2>
</Foo>

bisher gehe ich dafür folgender Maßen vor:

1. ich ändere alle {{ in ( und alle }} in ) (der Grund dafür kommt später):

$string = str_replace(array('{{', '}}'), array('(',')'), $string);

2. ich benutze rekursives Pattern-Matching um korrespondierende Klammern zu
finden

$pattern = '#\( (?: [^()]|(?R) )* \)#xs';
preg_match_all($pattern, $string, $matches);

damit bekomme ich sämtliche Klammerpaare auch auf einer Ebene und iteriere
über diese und baue so Schritt für Schritt über jede Rekursionstiefe die
entsprechende Struktur auf. Funktionieren tut es jedenfalls.

Ich fänd es allerdings deutlich angenehmer, wenn man Schritt 1 weglassen
könnte. Was allerdings das Problem aufwirft, wie man [^{{}}] erreichen
könnte, denn das entspricht ja leider [^{}], was mir aber nicht hilft. Ich
brauche also eine Negation einer Zeichenkette. Ist das überhaupt machbar?

Noch besser fänd ich eine Lösung mir preg_replace(_callback) - aber da habe
ich absolut keine Ahnung, wie das gelingen könnte, alle meine Versuche waren
vergeblich.

Ich habs auch mit (?1) versucht, dabei werden aber sämtliche
Zwischenschritte verworfen und man bekommt dann lediglich {{ Faz }}.

Für hilfreiche Tipps oder einen gänzlich anderen Ansatz wär ich euch
dankbar.

Johannes

--
Emails ohne "[nospam]" im Betreff werden kommentarlos gelöscht.


[ Auf dieses Posting antworten ]