BBCode Bilder mit verschiedenen Werten umwandeln - Reguläre Ausdrücke

MsvP@habdichliebhasi

Erfahrenes Mitglied
Hallo zusammen ich versuche mich gerade an erweitertem BB-Code bzw. dessen Rückumwandlung.

Zur Erklärung ich habe folgendes Muster:

Code:
[ img=CSS-KLASSE w=BREITE h=HÖHE]BILDPFAD[ /img]

Und das ganze soll am Ende dann so aussehen:

<img class="CSS-Klasse" width="BREITE" height="HÖHE" src="BILDPFAD" />

Jetzt habe ich schon einiges hin und her probiert mit preg_replace. Aber irgendwie schmeißt der mir immer Murks aus. Weil, dass ist nämlich die Schwierigkeit, es kann auch vorkommen, dass die BB-Codes nur so aussehen:

Code:
Variante 1: [ img]BILDPFAD[ /img]
Variante 2: [ img=CSS-KLASSE]BILDPFAD[ /img]
Variante 3: [ img w=BREITE h=HÖHE]BILDPFAD[ /img]
Variante 4: [ img=CSS-KLASSE w=BREITE h=HÖHE]BILDPFAD[ /img]
Mein letzter Versuch sah jetzt so aus, dass ich für jede Variante eine eigene Ersetzung vorgesehen hatte. Aber anscheinend mag er das nicht. Der nachfolgende Code verursacht immer wieder Fehler bei der Variante 2:
PHP:
$search = '/\[ img=(.*?)\ w=(.*?)\ h=(.*?)\](.*?)\[ \/img\]/si';
$replace = '<img class="\\1" width="\\2" height="\\3" src="\\4" />';
$beitext = preg_replace($search, $replace, $beitext);



Insgesamt sieht mein Quellcode im Moment so aus:
PHP:
// Variante 4
$search = '/\[ img=(.*?)\ w=(.*?)\ h=(.*?)\](.*?)\[ \/img\]/si';
$replace = '<img class="\\1" width="\\2" height="\\3" src="\\4" />';
$beitext = preg_replace($search, $replace, $beitext);

// Variante 3
$search = '/\[ img[\s]w=(.*?)[\s]h=(.*?)\](.*?)\[ \/img\]/si';
$replace = '<img width="\\1" height="\\2" src="\\3" />';
$beitext = preg_replace($search, $replace, $beitext);

// Variante 2				
$search = '/\[ img=(.*?)\](.*?)\[\ /img\]/si';
$replace = '<img class="\\1" src="\\2" />';
$beitext = preg_replace($search, $replace, $beitext);

// Variante 1
$beitext = preg_replace('/\[ IMG\](.*?)\[ \/IMG\]/si', '<img src="\\1" border="0">', $beitext);


Ich gehe derzeit davon aus, dass wahrscheinlich auch die anderen BB-Varianten von der 1. REPLACE-Variante beeinflusst werden.

Generell gefällt mir meine Lösung sowieso nicht wirklich. Da ich es sinnvoller fände, wenn es direkt in einer Abfrage mit entweder / oder - Entscheidungen zu machen wäre - leider übersteigt das aber derzeit mein Verständnis für Reguläre Ausdrücke.

Vielen Dank für eure Hilfe******

Ich glaube ich habe meinen Fehler gerade gefunden.

(.*?) das bedeutet "jedes Zeichen, egal ob es vorkommt".

Das macht natürlich keinen Sinn.

Ich habe es jetzt dahingehend geändert:

Code:
$search = '/\[ IMG=(\w+)\ W=(\d+)\ H=(\d+)\](.*?)\[ \/IMG\]/si';


Und siehe da - es scheint zu funktionieren.
 
Ganz ehrlich: BBCodes können gefährlich für eine Webseite sein und die Regular Expressions die ihr da benutzt, erfassen nicht die richtigen Informationen die wirklich erforderlich sind sondern ein Angreifer könnte die Muster locker umgehen und evtl. alles tun was er möchte....

Das wäre z.B eine eingedämmte Regex für Variante 4:
Code:
\[IMG\=\"[a-z\x20]{1,20}\"\x20{0,1}w\=[0-9]{1,4}\x20{0,1}h\=[0-9]{1,4}\](http\:\/\/www\..*?\.jpg)\[\/IMG\]

Natürlich müsste man outgoing-URLs, abfangen und ggf. nochmal gesondert überprüfen, die internen eher nicht.

Ich hoffe es hilft dir weiter... Der regex von mir sollte aufjedenfall funktionieren..
 
Zurück