Listen umwandeln

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Listen umwandeln

    Also, ich schreibe gerade ein Wiki (wenn ihr nicht wisst was das ist, reicht es wenn ihr euch vorstellt ich schreibe ein Board) in dem der User Listen nach folgender Syntax erstellen können soll:
    Code:
    Irgend ein Text
    *Listenpunkt 1
    *Listenpunkt 2
    *Listenpunkt 3
    *[X-beliebig viele weitere Punkte]
    Weiter im Text
    Dies soll dann in
    Code:
    Irgend ein Text
    <ul>
    <li>Listenpunkt 1</li>
    <li>Listenpunkt 2</li>
    <li>Listenpunkt 3</li>
    <li>[X-beliebig viele weitere Punkte]</li>
    </ul>
    Weiter im Text
    umgewandelt werden.

    Mein Lösungsansatz ging wie folgt:
    Zuerst sucht man mit preg_replace nach ganzen Listen (Also vom * des ersten Listenpunktes bis hinter das Zeilenende des letzten Listenpunktes), und übergibt die gefundenen Listen einem weiteren Preg_replace, das dann <ul> und </ul> jeweils an den Anfang und an das Ende der Liste setzt, und aus den einzelnen Zeilen der Liste (die mit dem * am Anfang) <li>text</li> macht.

    Hier der Code dazu:
    PHP-Code:
    function find_list($string)
    {
        return 
    preg_replace("/(\r\n|\n|\r)(\*.*)((\r\n|\n|\r)([^\*]))/Use""do_list('\\2')"$string);  // klappt nicht
    //  return preg_replace("/(((\r\n\r\n)\*.*)+)(\r\n|\r|\n)/e", "do_list('\\1')", $string);            // auch nicht :(
      
    }
        
      function 
    do_list($list)
      {
        return 
    "Ist egal was hier steht, die funktion find_list matched nicht richtig :(";
      } 
    [COLOR=red]Habt ihr ideen wie's klappen könnte, oder vielleicht komplett neue Ansätze?[/COLOR]

    EDIT:
    bitte benutze [ php ] statt [ code ], wenn du php-code postest, ist besser lesbar. wahsaga
    Zuletzt geändert von wahsaga; 04.12.2003, 14:28.

  • #2
    *grml* warum schwierig, wenns auch einfach geht:
    PHP-Code:
    $text explode("\r\n",$text);
    $zeilen count($text);
    $ausgabe = array();
    for(
    $i=0;$i<$zeilen;$i++)
    {
      if(
    substr($text[$i],0,2) == "* ")
      {
        if(
    substr($text[$i-1],0,2) != "* " || !isset($text[$i-1])) $ins1 "[ul]";
           else 
    $ins1="";
        if(
    substr($text[$i+1],0,2) != "* " || !isset($text[$i+1])) $ins2 "[/ul]";
           else 
    $ins2="";
        
    $ausgabe[$i] = $ins1."[list]".substr($text[$i],2,strlen($text[$i]))."[/list]".$ins2;
      }
      else
      {
        
    $ausgabe[$i] = $text[$i];
      }
    }
    echo 
    $text implode("\r\n",$ausgabe); 
    kann man sicher eleganter lösen, geht aber.
    Kissolino.com

    Kommentar


    • #3
      Original geschrieben von Wurzel
      *grml* warum schwierig, wenns auch einfach geht
      Ganz einfach: Performance! Die Idee mit dem durchlaufen jeder einzelnen Zeile hatte ich auch schon, hab sie aber schnell wieder fallen gelassen weil, du sagtest es ja bereits, man es auch eleganter (und 1000xPerformancefreundlicher) lösen kann.

      Und ich frag mich immer noch _warum_ mein Pattern nicht geht... rein logisch sehe ich da nix!

      Danke erst mal für deine Lösung, werd's erst mal so machen, aber nciht aufgeben das noch besser (schneller) hinzukriegen, also bitte nicht aufhören auf den Thread zu antworten

      Kommentar


      • #4
        Hier, hab's jetzt mal in schöner und 1000xMehrPerformance:

        Code:
        function find_list($string)
        {
          return preg_replace("/\n(\*.*)\n([^\*])/Use", "\$this->do_list('\\1', '\\2')", $string);
        }
        
          function do_list($string, $s)
          {
            $string = preg_replace("/\*([^\n]*)\n?/", "<li>\\1</li>", $string);
            return "\n<ul class=\"WikiUL\">".$string."</ul>".$s;
          }

        Kommentar

        Lädt...
        X