Hallo, Cheatah,
ich habe eine ähnliche Frage, deswegen hänge ich mich einfach mal hier dran anstatt einen neuen Thread aufzumachen.
Dir ist bewusst, dass auch das (z.B.) \s hier mitersetzt wird? Beschäftige Dich mit Zerowidth-Lookahead, oder am besten gleich mit der Bedeutung von \b.
Ich beschäftige mich gerade auch mit lookahead und lookbehind assertations, ich habe es vor einiger Zeit einmal durchblickt (d.h. ich konnte das realisieren, was ich wollte, von durchblicken jede Spur) aber wieder vergessen.
Mein Problem ist: Ich möchte alle in < und > eingefassten Bestandteile eines Strings finden. Hm, okay, dafür wäre auch ~<[^>]+>~ passend, aber mir geht es auch eher generell um RegExps, deshalb etwas kniffliger.
$murks='murks';
$string='murks1 murks2 murks3 murks4 <murks5 murks6 > murks7 murks8 <murks9> < murks10> murks11 <murks12> murks13 <murks>';
preg_replace('~(?!<)(?=[^<]*?)'.$murks.'(?<=[^>]*?)(?<!>)~U', 'purks', $string);
Testweise soll hier jedes murks, was innerhalb < und > steht, durch purks ersetzt werden, der String sollte nach dem Ersetzen so aussehen:
murks1 murks2 murks3 murks4 <purks5 purks6 > murks7 murks8 <purks9> < purks10> murks11 <purks12> murks13 <purks>
(murks und purks sind meine metasyntaktischen Variablen, ähnlich foo und bar. ;))
Obige lookahead/-behind assertations gehen natürlich nicht, weil sie eine undefinierte Länge haben. Nun dachte ich daran, auf selbige zu verzichten:
preg_replace('~(<)([^<]*)('.$murks.')([^>]*)(>)~U', '\1\2purks\4\5', $string);
Damit wird aber murks6 nicht gefunden... ohne das ungreedy geht übrigens gar nichts richtig... sehr seltsam, denn die RegExp matcht durchaus mehrfach, aber nicht an der richtigen Stelle... ich habe es aber nicht detailliert untersucht.
Nicht dass es sonderlichen praktischen Wert hat, aber mich würde es schon interessieren, wie man das lösen könnte... die lookbehind/-ahead assertations sind doch richtig verwendet, wenn man von dem * absieht?
BTW, kannst du mir ein Beispiel für den Unterschied zwischen ^und \A und $ und \Z geben (wenn der i pattern modifier gesetzt ist) - mir war nämlich bisher nur ^ und $ bekannt.
Kennst du zufällig eine deutsche Übersetzung der PCRE pattern syntax... die Originalversion hat nahezu keine verständlichen Beispiele.
Grüße,
Mathias