Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

rekursives pattern matching mit negation von zeichenfolgen

0 views
Skip to first unread message

Johannes Mueller

unread,
Nov 1, 2009, 11:43:55 AM11/1/09
to
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.

0 new messages