"We are back" « oc.at

SOLVED: Bräuchte Hilfe bei einer kleinen Regular Expression…

flaimo 06.07.2007 - 19:38 688 3
Posts

flaimo

ILFTKYS
Avatar
Registered: Dec 2001
Location: ask a ninja
Posts: 872
ich bin gerade dabei eine kleine extension für unser firmeninternes wiki (metawiki) zu schreiben wo gewisse strings nach dem posten automatisch verlinkt werden indem sie in eine vorlage gepackt werden. leider stehe ich mit regulären ausdrücken auf kriegsfuß darum bräuchte ich ein bißchen hilfe. soweit bin ich bis jetzt (auszug):

Code: PHP
$text = 'Dies ist ein Beispieltext mit den Referenzen ABC@1000.1000:abc und <b>DEF@2000.2000:def</b>. Die Referenz [[QWE@3030.3030:qwer]] und {{Referenz|POI@232.123:poi|diese andere Referenz}} sind bereits verlinkt. Auch [[technet:XYZ@666.666:xyz]] hat bereits einen Link';
echo '<hr><i>Originaltext:</i>' , $text , '<br />';

$text = preg_replace('(([A-Z]+@[0-9]+\.[0-9]+:[A-Za-z]{1}[A-Za-z0-9]+))', '{{Referenz|$1|$1}}', $text);
echo '<hr><i>Neuer Text:</i>' , $text , '<br />';

in dem text kommen fünf referenzen vor. allerdings sollen nur die ersten beiden mit "{{Referenz|" und ""}} ummantelt werden. die letzten drei sind bereits manuell mit dem wiki-syntax verlinkt worden. da soll die RegEx nicht greifen. im moment tut sie das aber an allen vier stellen. wie muss ich den ausdruck modifizieren, damit er die letzten drei auslässt?
Bearbeitet von flaimo am 06.07.2007, 23:20

that

Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11343
So wie ich das auf den ersten Blick sehe, brauchst du vor und nach dem bisherigen RegEx sowas wie ein [^[{] und ein [^]}] (wie auch immer man das genau macht, dass die eckige klammer in der eckigen klammer als literale eckige Klammer behandelt wird, musst du selbst rausfinden).

flaimo

ILFTKYS
Avatar
Registered: Dec 2001
Location: ask a ninja
Posts: 872
ich habs jetz mal mit

Code: PHP
$text = preg_replace('(([^\[\{\|])([A-Z]+@[0-9]+\.[0-9]+:[A-Za-z]{1}[A-Za-z0-9]+)([^\]\}\|]))', ' {{Referenz|$2|$2}} ', $text)

probiert, dass funktioniert aber auch nicht.

flaimo

ILFTKYS
Avatar
Registered: Dec 2001
Location: ask a ninja
Posts: 872
ok ich glaub ich habs:

Code: PHP
$text = preg_replace('(([^\[\{\|:A-Z]{1})([A-Z]+@[0-9]+\.[0-9]+:[A-Za-z]{1}[A-Za-z0-9]+))', '$1{{Referenz|$2|$2}}', $text);

das fehlende A-Z beim ersten ausschlussteil hat gefehlt
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz