Schorsch: Reguläre Ausdrücke bullet list aufzählung bbcode

Guten Tag

Folgender Text liegt vor:
 - Frosch
 - Wasser
 - Seerose
 - Fette Karpfe

Ich suche nun eine möglichkeit, diesen Text umzuwandeln, damit die Aufzählung per HTML ausgegeben wird:

<ul>
  <li>Frosch</li>
  <li>Wasser</li>
  <li>Seerose</li>
  <li>Fette Karpfe</li>
</ul>

Ich denke, ich muss da mit preg_replace() arbeiten. Einerseits muss ich ja die einzelnen Worte finden, damit ich die <li></li> drumherum bauen kann, andererseits muss ich aber auch den gesamten Block finden, damit ich die <ul></ul> drumherum bauen kann.

Weiss jemand etwas darüber? Kann mir jemanden einen Tip geben, einen Link, damit ich das Ganze lernen kann?

Gruss
Schorsch

  1. echo $begrüßung;

    Kann mir jemanden einen Tip geben, einen Link, damit ich das Ganze lernen kann?

    Wenn ich vor diesem Problem stünde, schnappte ich mir das in PHP geschriebene PmWiki und schaute mir dessen Lösung dieses Problems an. Ein weiterer Kandidat wäre auch noch PEARs Text_Wiki. Es gibt auch noch Unterklassen dazu, jedoch vermute ich das von dir gesuchte Programmteil nicht darin.

    echo "$verabschiedung $name";

    1. Salut

      Wenn ich vor diesem Problem stünde, schnappte ich mir das in PHP geschriebene PmWiki und schaute mir dessen Lösung dieses Problems an.

      Durchsuchte sämtlicher Quellcode. Wo genau befindet sich die Lösung?

      Gruss
      Schorsch

      1. echo $begrüßung;

        Wenn ich vor diesem Problem stünde, schnappte ich mir das in PHP geschriebene PmWiki und schaute mir dessen Lösung dieses Problems an.

        Durchsuchte sämtlicher Quellcode. Wo genau befindet sich die Lösung?

        PmWiki durchsuche ich jetzt nicht. Ich vermute aber, dass in der Nähe etwas von "list" oder "bullet" steht.

        PEARs Text_Wiki ist angenehm aufgeräumt. Dort gibt es eine eigene Klasse für die Listen: Text_Wiki_Parse_List

        echo "$verabschiedung $name";

        1. Salut

          PEARs Text_Wiki ist angenehm aufgeräumt. Dort gibt es eine eigene Klasse für die Listen: Text_Wiki_Parse_List

          Wow, vielen Dank! Sehr schön, wie der Code daher kommt!

          Gruss
          Schorsch

  2. Hi,

    • Frosch
    • Wasser
    • Seerose
    • Fette Karpfe

    Einfach nur im Text nach Zeilenanfang und '-' zu suchen erscheint mir zu anfaellig, da '-' ein haeufig auftretendes Zeichen ist.
    Bei bbcode verwendest Du tags - nur eben vereinfacht und mit eckigen Klammern. Wiki nutzt dagegen Zeichen wie z.B die geschweiften Klammern, um Bloecke zusammenzufassen: {| {{table}}

    Ohne Deine weiteren Anforderungen zu kennen denke ich das es Sinn macht, eine List in irgendeiner Form zu beginnen und zu beenden:

    [ul]

    • Frosch
    • Wasser
    • Seerose
    • Fette Karpfe
      [/ul]

    So kannst Du eindeutig festlegen, was spaeter mit dem entsprechenden Text passieren soll. Ansonsten: wer nach bbcode googelt der findet...

    Gruesse  Joachim

    --
    Am Ende wird alles gut.
    1. Salut

      Ohne Deine weiteren Anforderungen zu kennen denke ich das es Sinn macht, eine List in irgendeiner Form zu beginnen und zu beenden:

      [ul]

      • Frosch
      • Wasser
      • Seerose
      • Fette Karpfe
        [/ul]

      Ich kenne bbcode, möchte aber den Text ohne die [ul] codieren. Ich suche eine Ersetzungsroutine, welche mir

      • Frosch
      • Wasser
      • Seerose
      • Fette Karpfe

      erkennt und HTML-Listenmässig formatiert.

      Gruss
      Schorsch

      1. Hi,

        Ich kenne bbcode, möchte aber den Text ohne die [ul] codieren. Ich suche eine Ersetzungsroutine, welche mir

        • Frosch
        • Wasser
        • Seerose
        • Fette Karpfe

        Dann bleibt Dir imho nur das zeilenweise Parsen nach '-' am Zeilenbegin. Beim ersten Auftreten setzt Du einen Flag, der sowohl das einleitende  <ul>, als auch des abschliessenden </ul> steuert (Letzteres dann beim ersten _Nichtauftreten_ von '-').

        Gruesse, Joachim

        --
        Am Ende wird alles gut.
        1. Salut

          Dann bleibt Dir imho nur das zeilenweise Parsen nach '-' am Zeilenbegin. Beim ersten Auftreten setzt Du einen Flag, der sowohl das einleitende  <ul>, als auch des abschliessenden </ul> steuert (Letzteres dann beim ersten _Nichtauftreten_ von '-').

          Das mit dem Flag ist hochinteressant. Allerdings habe ich noch nicht herausgefunden, wie man einen Flag setzt.

          $text = preg_replace("#^[:blank:]*-(.+?)^#is", "<li>$1</li>", $text);

          ^         = Beginn einer neuen Zeile
          [:blank:] = Leerzeichen oder Tabulator
          *         = Darf keinmal oder x-mal vorkommen
          -         = gefolgt von einem -
          (.+?)^    = Alles danach nehmen, bis vor eine neue Zeile

          Das sind meine Überlegungen, aber es funktioniert noch nicht:
          Warning: preg_replace() [function.preg-replace]: Compilation failed: POSIX named classes are supported only within a class at offset 2

          Was mache ich falsch?

          Gruss
          Schorsch

          1. Salut

            Der Ausdruck:
            $text = preg_replace(
                        '=^([\t| ]{0,})(-|\d{1,}.)(.*)$=Ums',
                        "<li>$2 $3</li>",
                        $text
                    );
            bringt schön jede Aufzählung.

            Aber wie bringe ich die <ul> resp. <ol> an den Beginn/Ende der Aufzählung?

            Muss ich da in diese Richtung gehen?

            preg_match_all(
                        '=^([\t| ]{0,})(-|\d{1,}.)(.*)$=Ums',
                        $text,
                        $list,
                        PREG_SET_ORDER
                    );

            $text = '<ul>';
            foreach ($list as $key => $val)
            {
              $text .= '<li>'.$val[2].' '.$val[1].'<li>';
            }
            $text = '</ul>';

            Leider habe ich so aber den Text vor/nach der Aufzählung nicht mehr...

            Wer kann helfen?

            Gruss
            Schorsch

            1. Salut

              So geht es:

              $text = preg_replace(
                '=(.*)[1]{0,}(-|\d{1,}.)(.*)$=Ums',
                "$1<ul><li>$2 $3</li></ul>",
                $text
              );

              Gruss
              Schorsch


              1. \t| ↩︎

              1. Salut

                Leider geht es überhapt nicht.

                $text = preg_replace(
                  '=(.*)[1]{0,}(-|\d{1,}.)(.*)$=Ums',
                  "$1<ul><li>$2 $3</li></ul>",
                  $text
                );

                Ich müsste sagen können:

                Nimm einmal $1
                 Anschliessnd schreibe ein einziges mal:   <ul>
                 aber nur, wenn $2 == '-' ansonsten setze: <ol>
                 Nimm $3 ersetzt so oft wie vorhanden mit: <li>$3</li>
                 Schreibe nun noch ein einziges mal </ul> resp. </ol>
                 Hänge den restlichen Text noch dran.

                Kann man das überhaupt?

                Gruss
                Schorsch


                1. \t| ↩︎

                1. Huhu Schorsch,

                  wenn man eine callback-Funktion einsetzt wird es sehr viel einfacher.

                  Ungefähr so:

                  <?php

                  $text = <<< EOT

                  Das ist ein Beispiel.

                  - Apfel
                   - Birne
                   - Kokosnuss
                   - Erdbeere

                  Das wird eine einfache Aufzählungsliste.
                  EOT;

                  function makeList($m)
                  {
                   $s = '<ul>';
                   $s .= preg_replace('#^\s*-(.*)$#m','<li>\1</li>', $m[0]);
                   $s .= '</ul>';

                  return $s;

                  }

                  $text = preg_replace_callback(

                  '#(^\s*-.*\n)+#m',
                    'makeList',
                    $text
                  );

                  echo $text;

                  ?>

                  Viele Grüße

                  lulu

                  --
                  bythewaythewebsuxgoofflineandenjoytheday
                  1. Salut!

                    Wow, super. Vielen Dank. Mit dieser Callback-Funktion gehts tatsächlich.

                    Vielen Dank!
                    Schorsch

                    1. Hallo.

                      Wow, super. Vielen Dank. Mit dieser Callback-Funktion gehts tatsächlich.

                      Wenn du nicht auf PHP angewiesen bist und falls du ein paar weitere elaborierte Konvertierungsfunktionen benötigst, musst du dennoch nicht das Rad neu erfinden.
                      MfG, at