regulärer ausdruck, korrekte verschachtelung
dingo
- php
$pattern = array(
'/\[b\](.*?)\[\/b\]/is',
'/\[i\](.*?)\[\/i\]/is',
);
$replace = array(
'<strong>$1</strong>',
'<em>$1</em>',
);
$str = preg_replace($pattern, $replace, $str);
habe oberen code zum ausprobieren - bei konstrukten wie das hier zb
[b]conse[i]ctetuer[/b] dolor[/i]
bekomme ich natürlich ungültige verschachtelungen zusammen - hab mir jetzt schon ein paar fertige bbcode parser klassen angesehen aber da blicke ich nicht durch - ich versuche mir grade reguläre ausdrücke beizubringen und möchte das eben gleich anhand bb code erlernen - hat jemand einen tipp für mich, wie man da herangeht?
Hallo,
bei konstrukten wie das hier zb
[b]conse[i]ctetuer[/b] dolor[/i]
bekomme ich natürlich ungültige verschachtelungen zusammen
[...]
hat jemand einen tipp für mich, wie man da herangeht?
Du willst also falsche Verschachtelungen erkennen?
Das könnte z.B. so gehen: Der Reihe nach je ein tag einschließlich des folgenden Textes (also "[b]conse", "[i]ctetuer", "[/b] dolor", "[/i]") erkennen lassen und dann in eine Art Stack (Array) je ein erkanntes Element schieben, wenn es mit einem Start-tag beginnt, bzw. das letzte aus dem Stack wieder entfernen, wenn als nächstes ein End-tag kommt. Passt das End-tag nicht zum entfernten Start-tag, ist eine falsche Verschachtelung erkannt.
Der Stack würde sich also erst füllen mit
"[b]conse"
"[i]ctetuer"
und weil dann "[/b] dolor" folgt, was ein End-tag hat, wird "[i]ctetuer" wieder aus dem Stack entfernt. Da es nicht zu "[/b] dolor" passt, liegt eine falsche Verschachtelung vor. Weil man so die falsche Stelle immer im Zugriff hat mitsamt dem zugehörigen Text, kann man auch gleich eine Reparatur versuchen.
Das nur mal so als Denkanstoß. Die Sache ist nicht ganz trivial, besonders wenn die tags nicht paarweise auftreten, d.h. wenn einzele fehlen. Um das wenigstens zu merken, kann man zuerst alle Start-Tags und dann alle End-tags erkennen lassen, um zu prüfen, ob ihre Anzahl gleich ist. Wo genau ein tag fehlt, dürfte aber nicht so einfach festzustellen sein.
Viel Spass beim Weitertüfteln, Don P
echo $begrüßung;
bekomme ich natürlich ungültige verschachtelungen zusammen - hab mir jetzt schon ein paar fertige bbcode parser klassen angesehen aber da blicke ich nicht durch - ich versuche mir grade reguläre ausdrücke beizubringen und möchte das eben gleich anhand bb code erlernen - hat jemand einen tipp für mich, wie man da herangeht?
Die BBCode-Parser-Klassen gibt es ja nicht umsonst. Vielleicht ist es möglich, mit einem recht komplizierten Regulären Ausdruck bestimmte oder alle Fehlersituationen zu erkennen, aber was dann? RegExp sind ein mächtiges Werkzeug, aber irgendwo haben sie auch ihre (zumindest praktischen) Grenzen.
echo "$verabschiedung $name";
Hallo dedlfix,
Die BBCode-Parser-Klassen gibt es ja nicht umsonst. Vielleicht ist es möglich, mit einem recht komplizierten Regulären Ausdruck bestimmte oder alle Fehlersituationen zu erkennen, aber was dann? RegExp sind ein mächtiges Werkzeug, aber irgendwo haben sie auch ihre (zumindest praktischen) Grenzen.
So ist es. Mit *einem* regulären Ausdruck kann man m.E. falsche Verschachtelungen nicht erkennen, geschweige denn reparieren. Ich hatte das Problem einmal mit normalen HTML-tags. Habe es dann wie beschrieben gelöst, d.h. eigentlich nicht wirklich gelöst, weil es schlicht unmöglich ist.
Wenn es möglich wäre, gäbe es keine Compiler-Fehlermeldungen mehr wegen fascher Klammerung, fehlenden Semikolons z.B. in javascript usw. Man kann Fehler erkennen, so wie von mir beschrieben, aber es ist nicht möglich, sie in jedem Fall zuverlässig automatisch zu reparieren.
Nehmen wir einem einfachen Fall wie:
[b]Das [i]ist [/b]ein [/i]Text.
Woher sollte ein Programm nun wissen, ob eigentlich
[b]Das [i]ist [/i]ein [/b]Text.
oder vielmehr
[i]Das [b]ist [/b]ein [/i]Text.
gemeint war?
Auszeichnungssprachen sind dazu gemacht, von Maschinen geschrieben und gelesen zu werden. Wenn ein Mensch das Zeug von Hand notiert und dabei Fehler macht, ist jede Maschine überfordert.
Gruß, Don P
Hi,
hab mir jetzt schon ein paar fertige bbcode parser klassen angesehen aber da blicke ich nicht durch
Die Doku zu Christian Seilers StringParser_BBCode-Klasse ist recht ausfuehrlich und verstaendlich geschrieben - und ein einfaches Beispiel zur Umsetzung "simplerer" BBCodes hat's auch.
Natuerlich koennte man ueberlegen, ob der Einsatz einer solchen Klasse fuer ein Bisschen [b] und [i] nicht leichter Overkill ist, aber -
ich versuche mir grade reguläre ausdrücke beizubringen und möchte das eben gleich anhand bb code erlernen
MfG ChrisB