BB-Code und Smileys

Sasser

Erfahrenes Mitglied
Hallo Leute!

Ich nutze einmal Smileys, welche ersetzt werden und einmal BB-Codes. Beides unabhängig von einander funktioniert super, nur wenn beide Funktionen genutzt werden, treten Probleme auf:

PHP:
$message = $row[message];
$message = preg_replace('/\[B\](.*?)\[\/B\]/', '<b>$1</b>', $message);
$message = preg_replace('/\[U\](.*?)\[\/U\]/', '<u>$1</u>', $message);
$message = preg_replace('/\[I\](.*?)\[\/I\]/', '<i>$1</i>', $message);
$message = preg_replace('/\[IMG\](.*?)\[\/IMG\]/', '<img src="$1" width="400">', $message);
$message = preg_replace('/\[URL\](.*?)\[\/URL\]/', '<a href="$1" target="_blank">$1</a>', $message);

$db = connect_db();
$smileyresult = mysql_query("Select * FROM smileys", $db);
mysql_close($db);
while($smileys = mysql_fetch_assoc($smileyresult))
{
$message = str_replace($smileys[key], "<img src='images/smileys/$smileys[image]'>", $message);
}

echo nl2br($message);

Kommt das zum Beispiel als Adresse bei einem Bild raus:

http<img src='images/smileys/bored.gif'>/www.domain.de/banner/banner_468x60.gif
 
Guten Morgen,

liegt ganz einfach daran, dass du einen Smiley ":/" definiert hast. Wenn du dir eine URL ansiehst, ersetzt mit deiner Implementierung das str_replace diesen Teil aus "http://xyz.com" gegen die Smiley-URL.
Einfache Lösung: Leerzeichen vor/hinter einem Smiley erzwingen:

PHP:
while($smileys = mysql_fetch_assoc($smileyresult))
{
   $message = str_replace(" " + $smileys['key'] + " ", "<img src='images/smileys/" + $smileys['image'] + "'>", $message);
}
 
Vielen Dank für die schnelle Antwort!

Allerdings funktionieren nun die Smileys nicht mehr... Der BB-Code schon!

PHP:
$db = connect_db();
$smileyresult = mysql_query("Select * FROM smileys", $db);
mysql_close($db);
while($smileys = mysql_fetch_assoc($smileyresult))
{
$message = str_replace(" " + $smileys['key'] + " ", "<img src='images/smileys/" + $smileys['image'] + "'>", $message);
}
$message = preg_replace('/\[B\](.*?)\[\/B\]/', '<b>$1</b>', $message);
$message = preg_replace('/\[U\](.*?)\[\/U\]/', '<u>$1</u>', $message);
$message = preg_replace('/\[I\](.*?)\[\/I\]/', '<i>$1</i>', $message);
$message = preg_replace('/\[IMG\](.*?)\[\/IMG\]/', '<img src="$1" width="280">', $message);
$message = preg_replace('/\[URL\](.*?)\[\/URL\]/', '<a href="$1" target="_blank">$1</a>', $message);
echo nl2br($message);
 
Da misch ich mich doch grad ma ein :) xP

Und zwar, angenommen, mit dem oben genannten Code und vielen Smileys in der mySQL DB will man nun einen ziemlich langen (Forum, Gästebuch, ...) Eintrag 'formatieren'.

Dann dauert das ja recht lang (für jeden Smiley einmal den ganzen Text durchsuchen ...

Geht das net auch irgendwie auf ne schnellere Variante?

z.B. mit regEx oder so?
 
[phpf]str_replace[/phpf] sollte in der Regel schneller arbeiten als die preg_*-Funktionen. Du kannst [phpf]str_replace[/phpf] auch Arrays übergeben, so wird es nicht für jeden Smiley extra ausgeführt:
PHP:
$search = array(':)', ':D', ':P');
$replace = array('s1.gif', 's2.gif', 's3.gif');

$text = str_replace($search, $replace, $text);
 
Das mit dem Array bei str_replace weiß ich :P

Es ist nur, wie arbeitet das dann mit dem Array?
Arbeitet es eins nach dem anderen ab? Weil dann wäre es ja auch nicht schneller ...

Und wegen den preg_*-Funtkionen meinte ich sowas hier in der art:

Code:
~ :(\)|P|\() ~

Weill das schaut ja dann (wenn ich richtig lieg) ob das nach dem : ein ) also :) ein P also :P oder ein ( also :( vorkommt, was ja dann schneller sein sollte, als mit str_replace oder?
 
Vielen Dank für eure Hilfe!

Ich habs nun so realisiert, dass ich einfach ein Leerzeichen vor und hinter das Smiley mache und da funktioniert es!

:-)
 
Könntet ihr bitte noch meine Frage anschaun? :)

Ich hoffe sie wird noch beachtet, sonst muss ich neues Thema aufmachen, dass net als erledigt markiert ist xP
 
Ich bin mir ziemlich sicher, dass str_replace mit Array-Parametern schneller sein sollte, geht vermutlich den Text durch und ersetzt bei einem Treffer den String. Reguläre Ausdrücke sind meiner Meinung nach zuviel des Guten für eine einfache Ersetzung.
Im Zweifel einfach beide Versionen implementieren und die Laufzeiten vergleichen!
 
Zurück