Ich habe BB-Codes und gebrauche diese Funktion (Selbst gebastelt ^^):
function ParseBBCode($data)
{
$pattern = array(
"#\[B\]([^\[B\]]*)\[/B\]#i", // Fett
"#\[I\]([^\[I\]]*)\[/I\]#i", // Kursiv
"#\[U\]([^\[U\]]*)\[/U\]#i", // Unterstrichen
"#\[SUB\]([^\[\]]*)\[/SUB\]#is", // Tiefgestellt
"#\[SUP\]([^\[\]]*)\[/SUP\]#is", // Hochgestellt
//"#\[U\]([^\[\]]*)\[/U\]#is",
// PHP-BBCode
//'#\[php\](.*?)\[\/php\]#sei'
);
$replacement = array(
"<strong>\\1</strong>",
"<em>\\1</em>",
"<span style='text-decoration: underline;'>\\1</span>",
"<sub>\\1</sub>",
"<super>\\1</super>",
// PHP-BBCode
//"'<div class=\"php\">'.highlight_string(stripslashes('$1'), true).'</div>'"
);
$data = preg_replace($pattern,$replacement,$data);
//$data = preg_replace_callback('#\[php\](.*?)\[\/php\]#si',array(&$this,"ParsePHPBBCode"),$data);
return $data;
}
Funktioniert eigentlich auch schön und gut. Nur tritt das Problem auf, dass manche Treffer gar nicht getroffen werden.
So sind zum Beispiel *hier* die ersten 5 Zeilen Fett, die nächsten 5 nicht, dann wieder die letzten 2 Fett geschrieben.
*hier* hingegen sind die ersten 2 Zeilen Fett, dann kommen 3 Zeilen auf die der RegExp scheinbar nciht zutrifft :(
Hat wer ne Idee was isch falscht gemacht hab? :)
Nur ganz grob
Quote"#\[B\]([^\[B\]]*)\[/B\]#i"
Du definierst, dass die Zeichen zwischen [ b ] und [ /b ] weder [ NOCH b NOCH ] sein dürfen. Also kann kein Teil fett markiert werden, der ein 'b' enthält - wie alle deine nicht-funktionierenden Beispiele ;)
Du kannst das Problem einfach umgehen, wenn du auf "ungreedy" umstellst
/\[b\](.*?)\[\/b\]/
xyz-141el
// edit
Du hast natürlich Recht. Die [ und ] müssen im Regex escaped werden. Ich habe das oben einmal editiert.
Schön, dass ich helfen konnte.
Dass mir das nicht aufgefallen ist :O
Stimmt, alle haben ein b drin... Dooof...
Achja, irgendwie scheint es von nöten [ und ] auch zu maskieren, ansonsten bleiben [] im Text :)
xyz-48ke sehr, funktioniert nun endlich einwandfrei =)