Fehler bei Textausgabe durch BBCodes

fmeyer84

Mitglied
Hallo,

mit folgender Funktion lese ich formatierungen aus einem Text (in DB gespeichert):

PHP:
 function bbcode($text)
 {
 	$text = stripslashes($text);
 	$text = preg_replace("/\[fett\](.*?)\[\/fett\]/isU","<b>$1</b>", $text);
 	$text = preg_replace("/\[kursiv\](.*?)\[\/kursiv\]/isU","<i>$1</i>", $text);
 	$text = preg_replace("/\[underline\](.*?)\[\/underline\]/isU","<u>$1</u>", $text);
 	$text = preg_replace("/\[center\](.*?)\[\/center\]/isU","<center>$1</center>", $text);
 	$text = preg_replace("/\[url\](.*)\[\/url\]/isU", "<a href=\"$1\" target=\"_blank\">$1</a>", $text);
 	$text = preg_replace("/\[email\](.*)\[\/email\]/isU", "<a href=\"mailto:$1\">$1</a>", $text);
 	$text = preg_replace("/\[img\](.*)\[\/img\]/isU", "<img src=\"$1\" />", $text);
 	$text = preg_replace("/\[code\](.*)\[\/code\]/isU", "<pre>$1</pre>", $text);
 	$text = preg_replace("/\[color=red\](.*)\[\/color\]/isU", "<font color=\"red\">$1</font>", $text);
 	$text = preg_replace("/\[color=blue\](.*)\[\/color\]/isU", "<font color=\"blue\">$1</font>", $text);
 	$text = preg_replace("/\[color=green\](.*)\[\/color\]/isU", "<font color=\"green\">$1</font>", $text);
 	$text = preg_replace("/\[color=yellow\](.*)\[\/color\]/isU", "<font color=\"yellow\">$1</font>", $text);
 	$text = preg_replace("/\[size=1\](.*)\[\/size\]/isU", "<font size=\"1\">$1</font>", $text);
 	$text = preg_replace("/\[size=2\](.*)\[\/size\]/isU", "<font size=\"2\">$1</font>", $text);
 	$text = preg_replace("/\[size=3\](.*)\[\/size\]/isU", "<font size=\"3\">$1</font>", $text);
 	$text = preg_replace("/\[size=4\](.*)\[\/size\]/isU", "<font size=\"4\">$1</font>", $text);
 	$text = str_replace("&","&amp;",$text);
 	/* Smilies */
 	$text = str_replace(":)","<img src=\"images/smilies/smile.gif\" />",$text);
 	$text = str_replace(":-)","<img src=\"images/smilies/smile.gif\" />",$text);
 	$text = str_replace(":D","<img src=\"images/smilies/biggrin.gif\" />",$text);
 	$text = str_replace(":-D","<img src=\"images/smilies/biggrin.gif\" />",$text);
 	$text = str_replace(";)","<img src=\"images/smilies/wink.gif\" />",$text);
 	$text = str_replace(";-)","<img src=\"images/smilies/wink.gif\" />",$text);
 	$text = str_replace(":o","<img src=\"images/smilies/eek.gif\" />",$text);
 	$text = str_replace(":-o","<img src=\"images/smilies/eek.gif\" />",$text);
 	$text = str_replace(":?:","<img src=\"images/smilies/confused.gif\" />",$text);
 	$text = str_replace(":(","<img src=\"images/smilies/frown.gif\" />",$text);
 	$text = str_replace(":-(","<img src=\"images/smilies/frown.gif\" />",$text);
 	$text = str_replace(":p","<img src=\"images/smilies/tongue.gif\" />",$text);
 	$text = str_replace(":-p","<img src=\"images/smilies/tongue.gif\" />",$text);
 	$text = nl2br($text);
 	return $text;
 }

Verwende ich im Text zweimal die gleichen BBCodes, so wird auf einmal der ganze Text so dargestellt, wie der BBCode gewählt wurde (z.B. kursiv)... Komisch oder? Die BBCodes werden auch immer korrekt geschlossen, daran kann es also nich liegen.

Hat jemand Hilfe?

Grüße,
Fabian
 
Warum probierst du´s nicht einfach?! Ich kannst dir ehrlich gesagt auch nicht
erklären aber ich hab`s auch nur mit `is` und es funktioniert.

Zeig bitte mal einen Beispieltext, den dein Code "verpfuscht".
 
Hallo,

so klappt es. Danke!

Mal ne Frage: Was haben diese Parameter eigentlich für ne Bedeutung? Die Function ist nämliuch von nem Kumpel und der kann mir die Parameter nich mehr erklären...

Grüße,
Fabian
 
Das U steht für ungreedy.
D.h. dein Pattern ist nicht "hungrig". Ohne U würde der Ausdruck soviel wie möglich matchen, was sich innerhalb deiner BBCodes befindet. Wenn man also am Anfang des Textes mal [ b ] verwendet und mehrfach [ /b ] auftaucht, dann wird alles fettgeschrieben, was sich innerhalb des ersten [ b ] und des letzten [ /b ] befindet. Das kann aber nicht gewollt sein.

Jetzt wirst du dir sagen: "ich hab da doch das U stehen und trotzdem matcht der mir viel zu viel; der RegEx ist wohl doch noch 'hungirg'"
Tja, das liegt an diesen Fragezeichen in manchen Pattern.
Siehe z.B. hier:
Code:
/\[center\](.*?)\[\/center\]/isU
Das Fragezeichen nach den * sorgt sozusagen für die Umdrehung des Hungers.
In diesem Fall wäre der Ausdruck aufgrund des Us ungreedy (so sollte es auch sein). Durch das ? nach dem * drehst du diese Eigenschaft allerdings für diese eine Stelle um, dass heisst der Ausdruck wird an dieser Stelle hungrig...

Soviel zum Thema Erklärung.

Nun zur Problemlösung.
Entweder du setzt überall ein U hintendran und entfernst alle Fragezeichen die auf * folgen, oder du setzt eben überall ein ? nach dem * und entfernst überall die Us.

Ich hoffe das war jetzt halbwegs verständlich. So früh am Morgen kann ich nämlich noch nicht so richtig denken *g*
 
Wow, da kennt sich ja jemand richtig aus ^^

Mal eine kurze Frage zwischen drin, weil ich bei den ganzen Anhängseln auch nicht wirklich durch Blicke *werd mir gleich mal eine Liste suchen*

Ist das hier so korrekt? Funktionieren tut es auf jeden Fall, nur falls man da etwas weglassen könnte frage ich, die Funktion wird schlißlich sehr oft in einem Forum aufgerufen, und die einzigste dieser Art ist es auch nicht, somit wäre mir das alleine aus Performance-Gründe schon wichtig zu wissen.

Hier nun aber der Code
PHP:
preg_replace("/\[quote=(.+)\](.+)\[\/quote\]/Uis", '..ein viel zu langer code, um ihn zu posten...', $msg)

Wo ist da eigentlich der Unterschied zwischen + und * ?

byez und Danke schonmal
 
Zurück