• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Regular Expressions...

O

ohrflieger

Guest
Abend,

Code:
'/\[download=([^ ]+).*\](.*)\[\/download\]/'

Ein regulärer Ausdruck für eigenen "BBCode". Der Ausdruck soll eigentlich Download-Links umwandeln zu:

Code:
'<a class="downloadlink" href="download.php?file=$1">$2</a>'

Aber wenn man mehr als einen Downloadlink setzt, nimmt PHP leider den Inhalt von beiden als File. Beispiel: PHP macht aus dem hier

Code:
[download=file1.txt]File 1[/download][download=file2.txt]File 2[/download]
das hier
Code:
<a class="downloadlink" href="download.php?file=file1.txt]File 1[/download][download=file2.txt">File 2</a>

Wie kann man verhindern, dass beide Links zusammengefasst werden?
 
Werbung:
Das liegt am grundsätzlich "gierigen" Verhalten von Regulären Ausrücken. Das bedeutet ein * oder + belegt so viele Zeichen, wie möglich.
Der RegExp-Evaluator - RegExp-Tutorial - Modifier
Um dem entgegenzuwirken kannst du den Modifier U setzen oder ein Fragezeichen (siehe Codeschnipsel). Ich habe deinen Ausdruck mal ein wenig modifziert. Grundsätzlich ist es besser den Bereich der erlaubten Zeichen vorzugeben, als alle nicht erlaubten zu verbieten - dann hat man auch nicht so viele Probleme mit Greed. Ich habe außerdem mal eine Backreference (\1) gemacht. So kann man den Ausruck leicht erweitern.

Code:
#\[(download|url)=([A-z0-9\.-]+)\](.+?)\[/\1\]#is

Gruß
Voodoo
 
Danke, funktioniert wunderbar! :)
Deinen Link hatte ich vorher schon besucht und es mit dem u-Modifier versucht, dann allerdings wurde mir gar nichts mehr ausgegeben (keine Ahnung warum).
 
Werbung:
Wichtig: In PHP sind Regexe per Voreinstellung gierig. Das trifft seltener auf andere Sprachen zu.
 
Code:
#\[(download|url)=([A-z0-9\.-]+)\](.+?)\[/\1\]#is
dieser ausdruck ist zwar für den download tag zu gebrauchen für den url tag aber eher weniger da keine urls angegeben werden können

also nimm lieber den hier für downloads

Code:
/\[download=([A-z0-9\.-]+)\]([^\]]+)\[\/download\]/isU

dabei muss nur in der zweiten variable auf sicherheit geachtet werden, du könntest da aber auch sagen das da z.b. nur buchstaben und leerzeichen drins ein dürfen, das würden dann so aussehen

Code:
/\[download=([A-z0-9\.-]+)\]([A-z ]+)\[\/download\]/isU

für urls kannst du diesen nehmen da musst du aber bei beiden parametern auf sicherheit achten

Code:
/\[url=([^\]]+)\]([^\]]+)\[\/url\]/isU
 
Zurück
Oben