Reguläre Ausdrücke bullet list aufzählung bbcode
Schorsch
- php
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
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";
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
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";
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
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]
So kannst Du eindeutig festlegen, was spaeter mit dem entsprechenden Text passieren soll. Ansonsten: wer nach bbcode googelt der findet...
Gruesse Joachim
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
erkennt und HTML-Listenmässig formatiert.
Gruss
Schorsch
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
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
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
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
\t| ↩︎
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
Salut!
Wow, super. Vielen Dank. Mit dieser Callback-Funktion gehts tatsächlich.
Vielen Dank!
Schorsch
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