Rolf B: Regulärer Ausdruck, Ausnahme einfügen

Beitrag lesen

Hallo Jörg,

okay. Das ist immer so eine Sache mit den Glaskugeln - man glaubt was zu sehen und ist lieber zu vorsichtig.

Wenn Du schon einen BBCode hast, dann nutz ihn doch für deine Freigaben. Die User sollen ja sicherlich keine <a> oder <img> Elemente erstellen. Damit ist der Kontext einfacher und Du musst keine beliebigen URLs in freier Wildbahn finden.

Das geht sehr gut mit preg_replace_callback. Die Regex sollte dann nur den BBCode erkennen, und die Prüfung auf eine valide URL machst Du in der Callback-Funktion.

Wenn Du diese BBCodes akzeptierst:

[a]url[/a]
[a="url"]text[/a]
[img]url[/img]

ist das fix erledigt.

Um matchende Paare im BBCode zu erkennen, empfehle ich Dir Backreferences. Beispiel:

\[([a-z]+)].*?[/\1]  
  ********      ^^ 

findet alle Paare von [tag]...[/tag], egal welches Tag (solange man davon ausgeht, dass innerhalb von BBCode-Tags kein BBCode mehr erlaubt ist)

Über den Sternchen steht ein ganz normaler Teil der Regex. Hier: [a-z]+. Das ist eingeklammert, weil Backreferences sich immer auf Klammern beziehen. Es ist die erste Klammer, darum ist die Backreference \1. Die wird an der mit ^^ markierten Stelle benutzt. Die Regex Engine sucht also an dieser Stelle das, was sie vorher im Klammerpaar Nr. 1 gefunden hat.

Wenn Du das öffnende Tag noch um einen optionalen Parameter erweiterst:

\[([a-z]+)(=".?*")?]

Und noch ein paar benannte Gruppen daraus machst:

\[(?<tag>[a-z]+)(="(?<url>.?*)")?](?<content>.*?)[/\1]

Dann bekommst Du im Callback von preg_replace_callback ein Array, in dem die Schlüssel tag, url und content stehen. Die kannst Du dann auswerten, kannst prüfen, ob es eine valide URL ist, kannst das Schema prüfen (wie heute nachmittag erzählt) und dann, wenn Du einen Link oder ein Bild erzeugen willst, einen entsprechenden Replace-String zurückgeben.

Details findest Du in der PHP-Doku, das kau ich Dir jetzt nicht vor. Aber ich hab's gerade testweise gebaut, das geht.

Rolf

--
sumpsi - posui - obstruxi