PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Gesucht: Verbesserte BB-Codes



Tomarus
22.02.2005, 17:13
Moin :)
Da ich gerade mal wieder an meinem tollen Forum arbeitete, stoße ich mal wieder auf das Problem der BB-Codes. Gäbe ja verschiedene Möglichkeiten der Ersetzung.

1)
$text = str_replace ('\', '<strong>', $_POST['text']);
$text = str_replace ('\[/b\]', '</strong>', $text); // und so weiter mit den anderen Codes
Problem dabei dann: Niemand zwingt den User, den Tag auch wieder zuzumachen, womit sich das auf nachfolgende Schrift auswirken kann. Mögliche Notlösung:

$text .= '</b></i></u>';
Wobei man allerdings je nach Umfang der BB-Codes einiges zumachen müsste. Gefällt mir nicht.

2)
$text = eregi_replace ('\[b\](.*)\[/b\]', '<strong>//1</strong>', $_POST['text']);
Problem: Kommt nur klar, wenn in den Posts jeder Tag nur einmal verwendet wird. Sonst kommt was à la

<strong>Hallo! Wie geht's? Mir geht's gut!</strong>
Was dann auch nicht ganz das Wahre ist.

3) So hatte ich es mal notdürftig gelöst ...
$text = eregi_replace('\[b\](.*)\[b\]', '[b]\\1', $_POST['text']);
$text = eregi_replace('\[/b\](.*)\[/b\]', '\\1', $text);
$text = eregi_replace ('\[b\](.*)\[/b\]', '<strong>//1</strong>', $_POST['text']);
$text = eregi_replace ('\[b2\](.*)\[/b2\]', '<strong>//1</strong>', $_POST['text']);
Lässt sich zwar auf beliebig viele erweitern, produziert aber einmal sehr viel Code, und ist außerdem eben auch nicht perfekt. Ich kann mir also die Arbeit machen, und das auf 50 erweitern - wenn wer 51 verwendet, funktioniert's wieder nicht.

Daher hätte ich nun eben die Frage, wie man das am geschicktesten macht ... ob es eine kleine Erweiterung zu einem der oberen braucht, ob es eine hierfür günstige Alternative zu eregi_replace oder str_replace gibt, ob man um die Notlösung von 1) nicht herum kommt ... ich denke, ihr wisst Bescheid ;)

Geiu
22.02.2005, 17:23
Ich würd dafür die BB-Code-Klasse (http://christian-seiler.de/projekte/php/bbcode/) von Christian Seiler benutzen, damit kann man auch verschiedene Tagtypen und ihre Verschachtelung definieren. Ich selber benutz aber für die Seite an der ich gerade arbeite die Version mit str_replace(), weil nur die Admins Zugriff haben und daher niemand absichtlich Tags offen lässt

dead_orc
22.02.2005, 17:48
Ich würde es (und tu's auch) so machen:

<?php
$text = preg_replace('#\[b\](.*)\[\/b\]#Uis', "<strong>\\1</strong>", $text);
?>
Genau wie Möglichkeit 2, nur dass der Fehler nicht auftritt (informier dich über Perl-kompatible RegExps, wenn du wissen willst, wieso. Ich benutze immer preg und nie ereg!)

[EDIT]
Ich verwechsel das immer -.-

Tomarus
22.02.2005, 18:18
Ich würds/tus so machen:

<?php
$text = preg_replace('#\[b\](.*)\[\/b\]#Uis', "<strong>\\1</strong>", $text);
?>
Genau wie Möglichkeit 2, nur dass der Fehler nicht auftritt (informier dich über CGI-kompatible RegExps, wenn du wissen willst, wieso. Ich benutze immer preg und nie ereg!)

Tatsächlich, funktioniert ^^
Vielen Dank dafür :)

Jesus_666
22.02.2005, 20:50
Ich würde es (und tu's auch) so machen:

<?php
$text = preg_replace('#\[b\](.*)\[\/b\]#Uis', "<strong>\\1</strong>", $text);
?>
Genau wie Möglichkeit 2, nur dass der Fehler nicht auftritt (informier dich über CGI-kompatible RegExps, wenn du wissen willst, wieso. Ich benutze immer preg und nie ereg!)
Perl-kompatible Regexps. CGI != Perl.

Manni
23.02.2005, 13:24
Ich würde es (und tu's auch) so machen:

<?php
$text = preg_replace('#\[b\](.*)\[\/b\]#Uis', "<strong>\\1</strong>", $text);
?>


Ich war in letzter Zeit auch mit diesem Problem beschäftigt ;)
Bei dieser Lösung gibt es das Probem, das keine Verschachtelungen möglich sind. Das ist, solange es nur um geht nicht so schlimm, aber was ist, wenn ich Listen oder anderes Verschachteln würde?
Aus

Punkt 1

Punkt 1.1
Punkt 1.2

Punkt 2
würde dann zB
<ul>
<li>Punkt 1

<li>Punkt 1.1
<li>Punkt 1.2
</ul>
<li>Punkt 2

Der Rest würde ignoriert...

dead_orc
23.02.2005, 14:25
Diese Methode funktioniert bei meinem Forum wunderbar:

$text = preg_replace("#\[list\]\r\n(.+)\[/list\]#Uis", "<ul>\\1</ul>", $text);
$text = preg_replace("#\[list\]\n(.+)\[/list\]#Uis", "<ul>\\1</ul>", $text);
$text = preg_replace("#\[list\](.+)\[/list\]#Uis", "<ul>\\1</ul>", $text);
$text = preg_replace("#\[\*\](.+)\n#Uis", "<li>\\1</li>", $text);