Webstatt.org - Community seit 2006 - 2012 (2024?)

Merkwürdiges Verhalten mit RegExp

user-343
26.04.2006 18:26

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'zwinkern, true).'</div>'"
);

$data = preg_replace($pattern,$replacement,$data);

//$data = preg_replace_callback('#\[php\](.*?)\[\/php\]#si',array(&$this,"ParsePHPBBCode"zwinkern,$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 traurig

Hat wer ne Idee was isch falscht gemacht hab? lächeln

Avatar user-253
26.04.2006 18:43

Nur ganz grob

"#\[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 zwinkern

Du kannst das Problem einfach umgehen, wenn du auf "ungreedy" umstellst

/\[b\](.*?)\[\/b\]/


Michael

// 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.

user-343
26.04.2006 18:49

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 lächeln


Danke sehr, funktioniert nun endlich einwandfrei =)