tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
547
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Apr 2002
    Ort
    HH
    Beiträge
    3.224
    Welche regulären Ausdrücke muss ich verwenden, um aus:
    [ list ]
    [ * ]BlaBla
    [ * ]BlaBlub
    [ / list]
    (natürlich ohne Leerzeichen)
    < ul >
    [ li ]BlaBla
    [ li ]BlaBlub
    < / ul >

    und aus
    [ list ]
    [ # ]BlaBla
    [ # ]BlaBlub
    [ / list]
    (natürlich auch ohne Leerzeichen)
    < ol >
    [ li ]BlaBla
    [ li ]BlaBlub
    < / ol >

    zu machen. Gerne auch mit schließendem < / li >
    Probiere schon seit 3Std. und komme nicht auf ein gescheites Ergebnis.
    Danke für die Antwort hpvw
     

  2. #2
    Registriert seit
    May 2002
    Ort
    50.59° Nord 11.21° Ost
    Beiträge
    1.837
    Wie sieht denn dein bisheriges Ergebnis in PHP aus? Code?

    PHP-Code:
    // Check for List text
    $Text preg_replace("(\[list=point\](.+?)\[\/list\])is",'<ul>$1</ul>',$Text);
    $Text preg_replace("(\[list=num\](.+?)\[\/list\])is",'<ol>$1</ol>',$Text);
    $Text preg_replace("(\[\*\](.+?)\\n)is",'<li>$1</li>',$Text); 
    Ich glaub das mit den 3h nicht.
     
    »

  3. #3
    Avatar von Nils Hitze
    Nils Hitze Nils Hitze ist offline Admin a.D.
    Registriert seit
    Sep 2000
    Ort
    Dachau
    Beiträge
    2.201
    Blog-Einträge
    104
    Eigentlich ist der BBCode in genug Foren und in Google hinreichend dokumentiert...

    http://www.christian-seiler.de/projekte/php/bbcode/

    Bitte ein bisschen selber anstrengen, nächstes Mal.
    Danke,
    Nils
     

  4. #4
    Registriert seit
    Apr 2002
    Ort
    HH
    Beiträge
    3.224
    @_vodoo
    So, wie Du schreibst, würde meine Notlösung aussehen.
    Ich hätte es halt gerne, dass die Art der Liste durch das fürs < li > stehende BBCode Tag entschieden wird.
    Ich hatte mir überlegt, dass ich nach [ list ] irgendwas [ * ] irgendwas [ / list ] und [ list ] irgendwas [ # ] irgendwas [ / list ] suche. Und anschliessend die < li > zusammenbaue.
    Als Newbie in Sachen preg_replace ist das aber 'ne fiese Aufgabe.
    Mein aktueller Versuch, erstmal nur für unnummerierte Listen (der nicht klappt), sieht so aus:
    PHP-Code:
    $result preg_replace("!\[list\]((.|\n)*?)(\[\*\])((.|\n)*)\[/list\]!""<ul>\\1\\2\\3</ul>"$result);

    $result preg_replace("!\[\*\]((.|\n)*?)!""<li>\\1"$result); 
    Viele andere Versuche gingen auch schief.

    @Nils
    Danke für den Link, leider steht da auch nichts zu nummerierten Listen.
    Ich habe schon gesucht, wie verrückt (hier im Forum, in Google) und habe leider nichts passendes gefunden, sonst würde ich keinen Thread eröffnen.

    Gruß hpvw
     

  5. #5
    Christoph Bichlmeier Christoph Bichlmeier ist offline Mitglied Bronze
    Registriert seit
    Sep 2004
    Ort
    Passau
    Beiträge
    31
    Mit der Funktion preg_replace_callback habe ich es in wenigen Minuten gelöst:
    PHP-Code:
    function parseList($matches)
    {
        if(
    preg_match("/\[#\]/",$matches[1]))
        {
            return 
    "<ol>".str_replace("[#]","<li>",$matches[1])."</ol>";
        }
        else
        {
            return 
    "<ul>".str_replace("[*]","<li>",$matches[1])."</ul>";
        }
    }

    $result preg_replace_callback("/\[list\](.*)\[\/list\]/siU""parseList"$result); 
    Diese Lösung kann noch ins beliebige verbessert werden, z.B. Liste ganz rausnehmen, falls gar kein[*] oder [#] reingeschrieben wurde oder sowohl[*] als auch [#] in einer einzigen Liste behandeln usw. Die Grenzen sind unendlich, man braucht nur die Funktion "parseList" entsprechend erweitern.
    Kurz eine Besprechung der Funktion preg_replace_callback: als zweiter Parameter steht die Funktion, an die die gefundenen Gruppen übergeben werden sollen. Diese Funktion, in unserem Falle "parseList", muss ein Argument übernehmen. Dies wird automatisch als Array gebildet, so wird, im ersten Array-Element ($matches[0]) der Gesamtausdruck abgelegt, im zweiten Element ($matches[1]) die erste Gruppe des regulären Ausdrucks usw. Die Funktion muss mit return einen String zurückgeben: er wird an die Stelle des Patterns gesetzt. Der Rest sollte sich von selbst erklären.

    Wenn du das ganze in einer Klasse abhandelst, schreibst du:
    PHP-Code:
    $result preg_replace_callback("/\[list\](.*)\[\/list\]/siU", array(&$this,"parseList"), $result); 
    Das zweite Argument muss dann ein zweielem. Array sein, das zum einen eine Referenz auf die aktuelle Klasse (oder eine andere) übergibt, zum anderen wieder den Namen der Funktion.

    Eine Alternative wäre noch die Verwendung der Funktion preg_replace mit dem Pattern-Modifier e (steht für evaluate). Dabei wird die Zeichenkette, die als Ersatz eingefügt wird, wie PHP-Code behandelt, und somit sind auch da Funktionsaufrufe möglich (beachte aber die korrekte Verwendung der Hochkommata!).
     

  6. #6
    Registriert seit
    Apr 2002
    Ort
    HH
    Beiträge
    3.224
    Vielen Dank Chrstph,
    das ist ja der Wahnsinn, die Möglichkeiten scheinen ja echt unendlich.
    Eine Frage hätte ich noch:
    Gibt es einen Modifier, so dass der Pattern von hinten gesucht wird?
    So könnte man (hoffe ich) auch verschachtelte Aufzählungen zulassen.
    Alternativ auch einen Modifier, dass er von innen nach außen beginnt?

    Nochmal Danke, das hat mich viele Stunden nach vorn gebracht und gibt auch Ideen für andere noch ungelöste Probleme.

    Gruß hpvw
     

  7. #7
    Registriert seit
    Apr 2002
    Ort
    HH
    Beiträge
    3.224
    Habe das Verschachteln jetzt etwas dreckig wie folgt gelöst:
    PHP-Code:
            $r "";
            while (
    $r != $result) {
                
    $r $result;
                
    $result preg_replace_callback("/\[list\]((?!(.*\[list\]))(.*))\[\/list\]/siU""parseList"$result);
            } 
     

Ähnliche Themen

  1. BBCode Listen
    Von versuch13 im Forum PHP
    Antworten: 0
    Letzter Beitrag: 11.12.08, 11:41
  2. BBCode: [*]
    Von Leomuck im Forum PHP
    Antworten: 5
    Letzter Beitrag: 29.06.08, 19:20
  3. DLL Listen- Absturz, Listen übergeben
    Von haemmer im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 05.02.04, 21:00
  4. BBCode?
    Von Experience1986 im Forum PHP
    Antworten: 3
    Letzter Beitrag: 14.01.04, 15:26
  5. BBCode?
    Von alexanderneipp im Forum PHP
    Antworten: 2
    Letzter Beitrag: 18.09.02, 23:33