PHP preg_replace Parameter aus Datenbank

MiamXD

Lieutenant
Registriert
Mai 2012
Beiträge
887
Hey Leute,
ich hab gerade ein ziemlich nerviges Problem mit meinem selbstgeschrieben CMS.
Ich habe auf Wunsch einiger User BBcodes eingebaut. Dabei ahb ich die fest in die DAtei geschrieben und ersetze sie im String durch preg_replace().
PHP:
$search = array(
        '@\[(?i)b\](.*?)\[/(?i)b\]@si',
        '@\[(?i)i\](.*?)\[/(?i)i\]@si',
        '@\[(?i)u\](.*?)\[/(?i)u\]@si',
		'@\[(?i)size=(.*?)\](.*?)\[/(?i)size\]@si',
		'@\[(?i)font=(.*?)\](.*?)\[/(?i)font\]@si',
        '@\[(?i)img\](.*?)\[/(?i)img\]@si',
        '@\[(?i)url=(.*?)\](.*?)\[/(?i)url\]@si',
        '@\[(?i)code\](.*?)\[/(?i)code\]@si',
	    '@\[(?i)youtube\]http://(www\.|)youtube\.com/watch\?v=([a-zA-Z\d_\-]{11})\[/(?i)youtube\]@si',
        '@\[(?i)list\](.*?)\[/(?i)list\]@si',
        '@\[(?i)quote\](.*?)\[/(?i)quote\]@si',
		'@\[(?i)mp3\](.*?)\[/(?i)mp3\]@si'
		

);
$replace = array(
        '<b>\\1</b>',
        '<i>\\1</i>',
        '<u>\\1</u>',
		'<font size="\\1">\\2</font>',
		'<font face="\\1">\\2</font>',
        '<img src="\\1">',
        '<a href="\\1">\\2</a>',
        '<code>\\1</code>',
        '<object width="560" height="315"><param name="movie" value="http://www.youtube.com/v/\\2"></param><embed src="http://www.youtube.com/v/\\2" type="application/x-shockwave-flash" width="560" height="315"></embed></object>',
        '<li>\\1</li>',
        '<blockquote>\\1</blockquote>',
		'<embed src="http://www.jeroenwijering.com/embed/player.swf" width="320" height="65" allowscriptaccess="always" allowfullscreen="true"
		flashvars="height=65&width=320&file=\\1&showeq=true&showstop=true" />'
		
);
return preg_replace($search , $replace, $string);
Dieser Code funktioniert auch einwandfrei und ermöglicht die Ersetzung der BBCodes.

Nun habe ich aber keine Lust, jedesmal die Datei ändern zu müssen und dachte mir, ich könnte die beiden Arrays auch aus meiner Mysql Datenbank ziehen lassen, hätte ich auch den Vorteil, Erklärungen dazu gleich mit speichern zu können.
Also habe ich mir eine Datenbank angelegt mit den Spalten
id | bbcodetag | bbcodereplace | bbexample | bbexplanation

um jetzt möglichst wenig Code ändern zu müssen, habe ich einfach die obigen Datensätze in die entsprechenden Felder der Datenbank eingetragen, feintuning (vor Allem beim bbcodetag) wollte ich erst machen, wenn es wieder funktioniert.
Mein Code dazu sieht so aus:
PHP:
$sql='SELECT * FROM hp'.$n.'_bbcodes';
$result=mysql_query($sql);
$search=array();
$replace=array();
while($lresult=mysql_fetch_array($result))
{
$search[]=$lresult[1];
$replace[]=$lresult[2];
}
return preg_replace($search , $replace, $string);

print_r der beiden arrays gibt meines Erachtens auch die richtigen Aussagen wieder:
Code:
Array ( [0] => @\[(?i)b\](.*?)\[/(?i)b\]@si ) Array ( [0] => <b>\\1</b> )
Nur leider wird, wenn ich z.B. [b ]test[ /b] übergebe, zwar erkannt, dass es ersetzt werden muss, aber statt <b>test</b> wird nun <b>/1</b> ausgegeben, der placeholder wird also irgendwie nicht erkannt und der Text nicht beibehalten.

Ich würde mich nicht als sehr guten PHP Kenner bezeichnen, deswegen ist mein Problem bestimmt ziemlich simpel, aber ich komme alleine dabei nicht weiter, ich will doch nur meine BBCodes aus der Datenbank bezogen kriegen und nicht aus der Datei...

Kann mir jemand vielleicht den richtigen Denkanstoß geben?
 
Zuletzt bearbeitet:
Da ist beim Laden/Speichern des Strings das Escaping der Backslashes kaputtgegangen. Dein print_r verrät es:
Code:
Array ( [0] => <br>\\1</b> )
Was diese Ausgabe aber tatsächlich bedeutet, ist, dass der String '<b>\\\\1</b>' lautet. Vergleich:

Code:
php > $s = '<b>\\1</b>';
php > echo $s;
<b>\1</b>

Ich tippe, du hast entweder selbst addslashes() auf die Strings aufgerufen, bevor du sie in die Datenbank gespeichert hast, oder es wurde automatisch von deinem DB-Zugriffscode gemacht. Wie auch immer: einmal stripslashes() drauf sollte das Problem lösen.
 
Super hat funktioniert, danke! Ich dachte schon an irgendeinen Fehler beim escapen, aber dass es so simpel ist, hätte ich nicht gedacht!
 
Zurück
Oben