PHP Reguläre Ausdrücke multiple substitutionen

lordg2009

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.549
Hi,

ich wollte die Kommentarfunktion meiner Website mit rudimentären Editierfunktionen ein wenig aufpeppen. Die zusätzlichen Optionen werden, wie hier im Forum mit [X] eingeleitet und beendet. Der String wird dann durch ein php Script gejagt, welches mittels preg_replace die HTML Tags einfügt. Probleme habe ich nun beim finden des regulären Ausdrucksfür die Liste. Sie ist wie folgt aufgebaut:

[LISTE]
[*]Eintrag
[*]noch einer
[*]ein dritter
[/LISTE]

herauskommen soll:
<ul>
<li>Eintrag</li>
<li>noch einer</li>
<li>ein dritter</li>
</ul>

Was ich bis jetzt habe ist:
/\[LISTE\](.*?)\[LISTE\]/
Substitution:
<ul>$1<ul>

Zurückgegeben wird mir da nur der Mittelteil. Kann ich im selben Ausdruck noch die <li> Tags einsetzen?

Vielen Dank für eure Hilfe
 
Nein.

Streng genommen ist dein Ausdruck auch schon falsch (wenn man Listen schachtelt).

Im Prinzip brauchst du eine Regexp die die einzelnen Elemente matched (also "\[(/?LISTE|\*)\]") und den Rest verdröselst du dir dann in einer Callback-Funktion die sich merkt was los ist und etwaige fehlende [/LISTE] irgendwie zumacht. Das wäre dann so halbwegs ein Parser.

Die Lösung von z.B. MyBB (kannst dir den Sourcecode ja anschauen, inc/class_parser.php list_callback) geht so ungefähr in die Richtung aber nicht so wirklich... aber meistens interessierst ja eh niemanden wenn bbcode nur so halb schwanger - hauptsache es geht irgendwie
 
Hmm, na nen Ausdruck für die Liste hast du doch schon mit /\[LISTE\](.*?)\[LISTE\]/, was da bei rauskommt würde ich als fauler Mensch einfach über ein $array = explode('[*]', $string) in ein array stecken, das 0. Element unsetten (müsste leer sein?) und anschliesßend ein
PHP:
$string = '<li>'.implode('</li><li>', $array).'</li>';
machen. Bei so ein bisschen BBCode Gedöhns wird das den Kohl nicht fett machen und man kann sicher sein dass es geht :D

EDIT: wenn alle Stricke reißen würd ich mir da btw gar keine Platte machen und einfach die Tags [LISTENEINTRAG][/LISTENEINTRAG] einführen ;)

EDIT2: hab mal gegoogelt, es gibt sowohl eine PHP Erweiterung als auch ein PEAR Projekt was BB Code verarbeitet, gibts einen bestimmten Grund außer dem Lerneffekt warum du das selber machen willst?

http://php.net/manual/de/book.bbcode.php
http://pear.php.net/package/HTML_BBCodeParser2
 
Zuletzt bearbeitet von einem Moderator:
Nö, es geht um den Lerneffekt ;)

Danke für den Link, werde ich mir heute Abend mal durchlesen.

Ihr habt schon Recht, man muss ja nicht alles per Regex machen, aber diese faszinieren mich gerade.
 
@asdfman: Fhtagn?

Was die Regex - Geschichte angeht...
Da man theoretisch verschachtelte Listen bauen kann, musst du einen entsprechenden rekursiven Algorithmus verwenden. Du musst vor allem Greedy/Non-Greedy achten. Im Detail: Stell sicher, dass zwischen [LISTE] und [/LISTE] kein weiteres [LISTE] oder [/LISTE] kommt.

Du musst außerdem aufpassen, dass die Listen auch geschlossen sind. Während HTML5 für <li> Tag-Omission durchaus erlaubt, ist sie bei <ul>/<ol> explizit untersagt. Du brauchst dein </ul>, sonst zerballert es dir im Zweifel das Layout.
 
Danke, euch.

Ich möchte, dass alle Kommentare einheitlich sind. Rekursionen soll es gennerel nicht geben. Ich werde mir einen Algorithmus ausdenken, dass auf einen öffnenden Tag nur der schließende folgen darf. Ich habe jetzt ein anderes Problem, was meinen URL Tag angeht:

Aufbau:
google

PHP:
// externer Link
	$pattern = '/\[URL="(.*?)"\](.*?)\[\/URL\]/ism';
	$substitution = '<a href=$1>$2</a>';
	$parser_output = preg_replace($pattern, $substitution, $parser_output);

Leider funktioniert er nicht.
 
Zurück
Oben