Schickes Ding, nur wozu ist die while-Schleife da? Ersetzt preg_replace nicht alle Treffer?
Da hier ja immer wieder mal Diskussionen über die Umsetzung von 'BB-Code'-Formatierung geführt werden und ich jetzt selbst sowas gebrauchen konnte, hab jetzt mal eine eigene Parsing-Funktion für sowas geschrieben.
Anders als die 'Standard-Lösung' kommt meiner mit einem einzigen preg_replace für alle Tags aus (die Schleife um den preg-match()-Aufruf wird für verschachtelte Tags benötigt).
Es gibt nur ein Muster [TAG=ARGUMENT]INNERER_STRING[/TAG] (wobei =ARGUMENT optional ist), jedes Vorkommen wird mittels einer Callback-Funktion ausgetauscht, an die TAG, INNERER_STRING und ARGUMENT als übergeben werden.
Dort drin gibt's ein switch, das die Argumente auswertet und die entsprechende Ausgabe vornimmt.
Was haltet ihr von dem Ansatz?
Es ist umständlicher als einfach für jeden vorgesehenen Tag ein Pattern auszutauschen, aber ich finds so trotzdem irgendwie eleganter.
PHP-Code:function bbcode_replace($string)
{
while($old_string != $string)
{
$old_string = $string;
$string = preg_replace('{\[(\w+)((=)(.+)|(.*))\]((.|\n)*)\[/\\1\]}Ue', "bbcode_process('\\1', '\\6', '\\4');", $string);
}
return $string;
}
function bbcode_process($tag, $inner_string, $argument = false)
{
ob_start('ob_gzhandler');
switch($tag)
{
case 'b':
case 'i':
case 'u':
echo "<$tag>$inner_string</$tag>";
break;
case 'code':
echo '<b>Code:</b><hr /><pre style="font-size:12px;">' . $inner_string . '</pre><hr />';
break;
case 'color':
$color = preg_match("[^[0-9a-fA-F]{3,6}$]", $argument) ? '#' . $argument : $argument;
echo '<span style="color:' . $color . '">' . $inner_string . '</span>';
break;
case 'email':
$address = $argument ? $argument : $inner_string;
echo '<a href="mailto:' . $address . '">' . $inner_string . '</a>';
break;
case 'image':
echo '<img src="' . $argument . '" />';
break;
case 'quote':
echo '<b>Quote:</b><hr />' . $inner_string . '<hr />';
break;
default: // unknown tag => reconstruct and return original expression
echo '[' . $tag . ']' . $inner_string . '[/' . $tag .']';
break;
}
$buffer = ob_get_contents();
ob_end_clean();
return $buffer;
}
Schickes Ding, nur wozu ist die while-Schleife da? Ersetzt preg_replace nicht alle Treffer?
is aber nicht sehr schön oder?PHP-Code:case 'b':
case 'i':
case 'u':
echo "<$tag>$inner_string</$tag>";
break;
ich mein eine $var in "" setzen.
Was ist eigentlich falsch daran?
Alex
nixOriginal geschrieben von holunda
is aber nicht sehr schön oder?
ich mein eine $var in "" setzen.
Was ist eigentlich falsch daran?
Alex![]()
Sieht schick aus. Ich werd's die Tage mal auf meiner Seite ausprobieren. Danke![]()
class GetProfileCustomerEntityReceiverInformationReceiverAndProgrammingInforma...{
public function __construct(){ if(!$this) die(' '); } }
http://www.thedailywtf.com/
hab mal irgendwo aufgeschnappt dass man das so machen soll:
und da wollte ich fragen was der Unterschied ist ...PHP-Code:echo "<".$tag.">".$inner_string."</".$tag.">";
Da gehts lang: http://www.traum-projekt.com/forum/s...720#post186720
Gruss
Jan
Jein. Ineinander verschachtelte Vorkommen kann es nicht mit einem Aufruf komplett austauschen, daher ist die Schleife notwendig:Schickes Ding, nur wozu ist die while-Schleife da? Ersetzt preg_replace nicht alle Treffer?
PHP-Code:[b][i]Dieser Text ist fett und kursiv[/i]/b]
Nach ersten Aufruf:
<b>[i]Dieser Text ist fett und kursiv[/i]</b>
Verstehscht?
==> nach 2. Aufruf:
<b><i>Dieser Text ist fett und kursiv</i></b>
Wenn man's ganz genau nimmt, hast Du recht.hab mal irgendwo aufgeschnappt dass man das so machen soll:
Variablen in Strings zu parsen,
kostet PHP theoretisch ein klitzekleinesbisschen mehr Zeit, als den String aus 'festen' Werten und Variablen zusammenzusetzen.
Der Unterschied dürfte allerdings in den allermeisten Fällen derart gering sein, dass man der Übersichtlichkeit des Codes auch mal Vorrang geben kann.
Und nochwas:
Falls ihr das benutzen wollt, schmeißt den Krams mit dem Output Buffering raus. Mir fiel im Nachhinein ein, das ist in dem Fall völlig unnötig ist.
Ich hatte den Output Buffer erst 'aus Gewohnheit' verwendet, weil ich eine sehr ähnliche Funktion habe, die mit includes arbeitet (und da braucht mans).
Hier reichts völlig aus, statt den echos die Replacement-Strings in eine Variable zu schreiben und die zurückzugeben.
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)