Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
08.10.2010, 21:48
the_Crow



Ich habe einen recht simplen BBCodeParser in eines meine PHP-Skript integriert, der sonst auch wunderbar funktioniert. Wie der Titel schon sagt, funktioniert der Parser aber nur mit <= 3220 Zeichen.

Wenn man mehr als 3220 Zeichen durch den Parser laufen lässt, kommt nur eine leere Seite. Dh es wird auch kein Html ausgegeben (egal an welcher Stelle im File).

Das Skript holt sich Text aus einer MySQL-Datenbank, schickt ihn durch den BBCodeParser und gibt den neuen Text aus.
Auch wenn ich den Text nicht aus einer Datenbank hole, sondern direkt im Skript hab, funktioniert es nicht.

Leider gibt es auch keine Fehlermeldung. Nicht im Browser und auch nicht im Logfile am Server.

Am Text selbst wird es auch nicht liegen, da ich es bereits mit verschiedenen Texten versucht hab.

Ich hoffe einer von euch hat eine Lösung parat.

Quellcode:function bbcode($string)
{
    $string = htmlentities ($string);
    $string = nl2br ($string);
    
    while($old_string != $string)
    {
        $old_string = $string;
        $string = preg_replace_callback('{\[(\w+)((=)(.+)|())\]((.|\n)*)\[/\1\]}U', 'bbcode_callback', $string);
    }
    
    $string = preg_replace('/\[\*\](.*?)\\n/', '<li>$1</li>', $string);

    return $string;
}

function bbcode_callback($matches)
{
    $tag = trim($matches[1]);
    $inner_string = $matches[6];
    $argument = $matches[4];
    
    switch($tag)
    {
        case 'b':
        case 'i':
        case 'u':
        case 'center':
            $replacement = "<$tag>$inner_string</$tag>";
            break;

        case 'code':
            $replacement =  '<b>Code:</b><pre style="font-size:12px;width:450px;overflow:auto;">' . highlight_string ($inner_string, true) . '</pre></div>';
            break;

        case 'color':
            $color = preg_match("[^[0-9a-fA-F]{3,6}$]", $argument) ? '#' . $argument : $argument;

            $replacement =  '<span style="color:' . $color . '">' . $inner_string . '</span>';
            break;

        case 'email':
            $address = $argument ? $argument : $inner_string;
            $replacement =  '<a href="mailto:' . $address . '">' . $inner_string . '</a>';
            break;

        case 'img':
            $replacement =  '<img src="' . $inner_string . '" alt="Bild: ' . $inner_string . '" />';
            break;

        case 'size':
            if (is_numeric($argument) && $argument > 5 && $argument < 64)
            {
                $replacement =  '<span style="font-size:' . $argument . 'px;">' . $inner_string . '</span>';
            }
            break;

        case 'quote':
            $replacement =  '<b>Quote:</b><hr />' . $inner_string . '<hr />';
            break;

        case 'url':
            $url = $argument ? $argument : $inner_string;
            $replacement =  '<a href="' . $url . '" target="_blank">' . $inner_string . '</a>';
            break;

        case 'forum':
            $url = $argument ? $argument : $inner_string;
            $replacement =  '<a href="http://forum.tibiagerman.com/thread.php?threadid=' . $url . '" target="_blank">' . $inner_string . '</a>';
            break;
            
        case 'br':
            $replacement = '<br />';
            break;
            
        case 'list':
            $replacement = '<ul>' . $inner_string . '</ul>';
            break;

        default:    // unknown tag => reconstruct and return original expression
            $replacement = '[' . $tag . ']' . $inner_string . '[/' . $tag .']';
            break;
    }

    return $replacement;
}

--

www.the-crow.at - meine persönliche Website | TibiaGerman | Twitter | Wiaschtlsiada

zum Seitenanfang zum Seitenende Profil || Suche
001
08.10.2010, 22:52
Prefect



Wie kommst du darauf, dass das Limit genau 3220 Zeichen sind?

Ohne deinen Code wirklich durchgelesen zu haben liegt es irgendwie näher, dass dein Test-Text mit den 3220 Zeichen zufälligerweise eine BB-Code-Kombination enthält die deinen Code verwirren, dass es also nicht an der Länge selbst liegt.

Daher: Erstmal verschiedene Inputs durchprobieren und uns dann erklären wie du darauf kommst, dass die Anzahl der Zeichen ein Problem ist.

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
002
08.10.2010, 23:04
the_Crow



Zitat:
Prefect postete
Wie kommst du darauf, dass das Limit genau 3220 Zeichen sind?
Abgezählt?

Zitat:
Prefect postete
Ohne deinen Code wirklich durchgelesen zu haben liegt es irgendwie näher, dass dein Test-Text mit den 3220 Zeichen zufälligerweise eine BB-Code-Kombination enthält die deinen Code verwirren, dass es also nicht an der Länge selbst liegt.

Daher: Erstmal verschiedene Inputs durchprobieren und uns dann erklären wie du darauf kommst, dass die Anzahl der Zeichen ein Problem ist.

Zitat:
the_Crow postete
Am Text selbst wird es auch nicht liegen, da ich es bereits mit verschiedenen Texten versucht hab.
Soll heißen ich hab auch Inputs ohne BBCode versucht. z.B. nur Punkte oder Buchstabensalat.

--

www.the-crow.at - meine persönliche Website | TibiaGerman | Twitter | Wiaschtlsiada

zum Seitenanfang zum Seitenende Profil || Suche
003
09.10.2010, 00:23
Prefect



Das ist doch schonmal was. Du hast also einen Dummy-Text aus 3220 Punkten versucht und der funktioniert, aber ein Dummy-Text mit 3221 Punkten schlägt fehl?

Hast du schonmal ein paar Standard-Debugging-Techniken ausprobiert? Ich würde zum Beispiel mal ausprobieren, an welcher Stelle in deiner Funktion bbcode aus dem Originalstring plötzlich ein leerer String wird.

Wenn es in dem preg_replace_callback stattfindet wäre der nächste Schritt ein Sanity-Check: Schau nach, ob bbcode_callback die Argumente bekommt die du erwartest, und ob es die richtige Rückgabe erzeugt. Und so weiter.

Ich kenne mich nicht genug mit PHP aus und muss zugeben, dass ich keine Lust habe mich durch fremde Regexes durchzufressen, aber mit diesen Techniken sollte es möglich sein, das Problem schrittweise einzugrenzen, bis du es selbst finden kannst.

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
004
09.10.2010, 05:05
LeJean



Hast du mal ne andere Regexp ausprobiert? Wenn du ne einfachere Ersetzung machst, sind die Zeichen dann auch begrenzt?

Grad aufgefallen: Warum benutzt du so inkonsistent die Delimiter in deinen RegExes? Mal geschweifte Klammern, dann Slashes, dann eckige Klammern. Und die eckigen Klammern hier
Quellcode:preg_match("[^[0-9a-fA-F]{3,6}$]", $argument) machen dir sicher Probleme, weil deine Regex schon nach dem "F" geschlossen werden würde. Abgesehen davon sind eckige Klammern als Delimiter in PHP gar nicht erlaubt, so weit ich weiß. Ist zwar nix, was dein aktuelles Problem betrifft, aber ich wollt's dir gesagt haben..

--


Dieser Beitrag wurde am 09.10.2010 um 05:25 von LeJean bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
09.10.2010, 09:46
Deathstar



Nur mal ne frage: timeout?

--

zum Seitenanfang zum Seitenende Profil || Suche
006
09.10.2010, 10:32
the_Crow



Zitat:
Deathstar postete
Nur mal ne frage: timeout?
Immer dann, wenn man mehr als 3220 Zeichen durch den Parser schickt?

Den Server kann man auch ausschließen. Habs auf zwei anderen Servern und auf meinem Heimrechner versucht. Selbes Ergebnis.

Edit:
Habs gelöst, indem ich die erste Funktion wie folgt geändert hab:
Quellcode:function bbcode($string)
{
    $string = explode ("\n", $string);
    
    foreach ($string as $lines => $line)
    {
        $line = htmlentities ($line);
        $line = nl2br ($line);
        
        while($old_string != $line)
        {
            $old_string = $line;
            $line = preg_replace_callback('{\[(\w+)((=)(.+)|())\]((.|\n)*)\[/\1\]}U', 'bbcode_callback', $line);
        }
        
        $string[$lines] = $line;
    }
    
    $string = implode ("\n", $string);
    
    $string = preg_replace('/\[\*\](.*?)\\n/', '<li>$1</li>', $string);
    $string = preg_replace('/\[list\]/', '<ul>', $string);
    $string = preg_replace('/\[\/list\]/', '</ul>', $string);

    return $string;
}
Muss aber noch testen ob es auch wirklich so funktioniert wie ich das haben will.

Edit2: Bis jetzt scheint alles so zu tun wie ich das möchte.

--

www.the-crow.at - meine persönliche Website | TibiaGerman | Twitter | Wiaschtlsiada


Dieser Beitrag wurde am 09.10.2010 um 12:11 von the_Crow bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
007
09.10.2010, 23:44
default



du ersetzt solange bb tags in jeder zeile - für den gesamten text, bis die ausgabe gleich der eingabe ist?
gibts für den scheiss keine grammatik?

--

Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst.

zum Seitenanfang zum Seitenende Profil || Suche
008
10.10.2010, 11:45
default



manual lesen:
Quellcode:Don't use this function to fetch BBCode, as explained. If you have some text that runs over 5000 chars (average), it will run out of its limit and makes you download the PHP page.

According to this, you should instead use something more advanced yet complex. You will need a function called "str_replace_once()" (search for it), one called "countWord()", the famous "after()", "before()", "between()".
http://php.net/manual/de/function.preg-replace-callback.php

--

Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst.

zum Seitenanfang zum Seitenende Profil || Suche
009
10.10.2010, 13:22
Chronial



Die Methode die dort empfohlen wird funktionert aber wohlgemerkt nicht wirklich. Damit geht z.B. sowas: blubblubblub und daraus wird dann invalides html.

Wenn die Performance nicht ganz kritisch ist, würde ich die empfehlen, einen preg_match_all mit deinem Pattern laufen zu lassen (mit offset capture aktiviert).

Dann hast du ein Array, das nurnoch alle tags (und daran Position) enthält. Darauf kannst du dann arbeiten und auch ziemlich einfach das Zeug im Text ersetzen.

Zitat:
du ersetzt solange bb tags in jeder zeile - für den gesamten text, bis die ausgabe gleich der eingabe ist?
gibts für den scheiss keine grammatik?
Glaube nicht - du bekommst du Probleme, weil ja an sich alles erlaubt ist. Ich vermute mal Grammatiken taugen wenig, um tags aus sonstigem random-text zu fischen. Nach dem Schritt oben kannst du das natürlich Grammatik-Style parsen.

--

"tsuji-giri" (japanisch) - ein neues Schwert an einem Passanten ausprobieren


Dieser Beitrag wurde am 10.10.2010 um 13:37 von Chronial bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
010
11.10.2010, 00:55
LeJean



o_O
Was bitte soll eine Grammatik denn sonst tun?

--

zum Seitenanfang zum Seitenende Profil || Suche
011
12.10.2010, 17:14
Chronial



Grammatiken definieren formale Sprachen. Wie wiki so schön sagt: "eine Teilmenge der Kleeneschen Hülle des Alphabets". Problem ist: unser Alphabet ist UTF8, und unsere Teilmenge ist alles. Wie hilft uns jetzt hier ne Grammatik weiter?

Zitat:
o_O

--

"tsuji-giri" (japanisch) - ein neues Schwert an einem Passanten ausprobieren


Dieser Beitrag wurde am 12.10.2010 um 17:15 von Chronial bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
012
12.10.2010, 18:28
Prefect



Nur auf der untersten Ebene definieren Grammatiken lediglich eine Teilmenge gültiger Worte ("Wort" hier im bei formalen Sprachen üblichen Sinn). Darüber hinaus kann man eine Grammatik verwenden, um über den Parse-Tree nützliche Informationen zu bekommen.

Und ich wette, dass dir das genauso klar ist wie LeJean, nur dass du halt so tust als ob, damit du hier mir ein paar frisch gelernten Fachwörtern den tollen Hengst heraushängen lassen kannst.

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
013
13.10.2010, 11:20
default



die argumentation überzeugt:
grammatiken gehen nür für 7 bit ascii.
aber der text ist ja utf8!

nach der logik kann man ua auch utf8 garnicht parsen, weils kein 7bit ascii ist - macht sinn und erklärt einiges.

eine frage habe ich dann aber doch noch, das verwendete pcre, ist das nicht auch eine grammatik die mit utf funktioniert?

davon ab, gibt es für php wohl nur einen pg, lime.
http://en.wikipedia.org/wiki/Comparison_of_parser_generators

das ist schwach, aber pal halt.

--

Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst.


Dieser Beitrag wurde am 13.10.2010 um 11:27 von default bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
014
13.10.2010, 11:53
Chronial



Zitat:
Und ich wette, dass dir das genauso klar ist wie LeJean, nur dass du halt so tust als ob, damit du hier mir ein paar frisch gelernten Fachwörtern den tollen Hengst heraushängen lassen kannst.
Da liegst du in mehreren Aspekten falsch :). Und was wäre denn deiner Meinung nach die richtige Antwort auf
Zitat:
o_O
Was bitte soll eine Grammatik denn sonst tun?
?

Zitat:
die argumentation überzeugt:
grammatiken gehen nür für 7 bit ascii.
aber der text ist ja utf8!

nach der logik kann man ua auch utf8 garnicht parsen, weils kein 7bit ascii ist - macht sinn und erklärt einiges.

Ich habe nicht die geringste Ahnung wovon du redest. Habe ich irgendwo geschrieben, dass utf8 bei der ganzen Angelegenheit ein Problem darstellt? oO

Und das es für php lime gibt ändert auch nichts an meiner Ursprünglichen Aussage, die ich gerne nochmal wiederhole: Ich bezweifle stark, dass es für bbcode eine Kontextfreie Grammatik gibt, da es keine Möglichkeit gibt, tags von nicht-tags zu unterscheiden. Wenn man allerdings preg_match_all drüber laufen lässt erhält man ein Array, das man mit einer kontextfreien Grammatik parsen kann.

PS: Es war nicht zufällig jemand aus diesem Thread am Thewall BB-Code parser beteiligt? Der Erzeugt nämlich das hier: <b>blub<i>blub</b>blub</i> ^^.

*edit: Mir fällt grad ein, dass das natürlich nicht stimmt - du kannst BB-Code nie mit einer Kontextfreien Grammatik parsen, da so ein parser z.B. nie mit Konstrukten wie dem Erwähnten <b>blub<i>blub</b>blub</i> klar kommen wird.

--

"tsuji-giri" (japanisch) - ein neues Schwert an einem Passanten ausprobieren


Dieser Beitrag wurde am 13.10.2010 um 12:06 von Chronial bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
015
13.10.2010, 12:38
default



darf man das umlenken auf kontextfreie grammatiken als einsicht werten?
nach deiner logik kann man btw ua auch html nicht parsen, na merkst du was?

--

Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst.

zum Seitenanfang zum Seitenende Profil || Suche
016
13.10.2010, 20:13
Prefect



Zitat:
Chronial postete
PS: Es war nicht zufällig jemand aus diesem Thread am Thewall BB-Code parser beteiligt? Der Erzeugt nämlich das hier: <b>blub<i>blub</b>blub</i> ^^.
Ja, da hat vermutlich jemand gesagt, aus einfachen Effizienzgründen machen wir da ein stupides Search-Replace statt einer weitergehenden Analyse von Verschachtelung.
Zitat:
*edit: Mir fällt grad ein, dass das natürlich nicht stimmt - du kannst BB-Code nie mit einer Kontextfreien Grammatik parsen, da so ein parser z.B. nie mit Konstrukten wie dem Erwähnten <b>blub<i>blub</b>blub</i> klar kommen wird.
Deswegen lässt man solche Konstrukte normalerweise in Programmier- und Markup-Sprachen auch nicht zu. Dass der Code hier im Forum sowas erlaubt ist vermutlich ne pragmatische Fallentscheidung gewesen.

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
017
14.10.2010, 06:04
default



Ich denke das Hauptargument ist Benutzerfreundlichkeit, das P in dp steht nämlich für 'Parser', Mangel an * wirds also nicht sein.

Wenn man das korrekt machen wollte, müsste man nämlich alle defekten posts zurückweisen, und der Nutzer müsste immer validen bb code posten.

Um die Diskussion abzukürzen habe ich da mal was vorbereitet:
Quellcode:#!/usr/bin/env python
#
# aptitude install python-ply
# Theoretisch unmoeglich? in Python keine 200 loc.
#

import ply.lex as lex
import ply.yacc as yacc


teststr = "[b]test[/b] [ [/] 123 [b] 234 [/b] [i][b][i][/i][/b][/i]"

tokens = (
    "TEXT",
    "OPEN",
    "CLOSE",
    "SLASH",
    "BOLD_OPEN",
    "BOLD_CLOSE",
    "ITALIC_OPEN",
    "ITALIC_CLOSE",
)

literals = ['b','i']

t_OPEN = r"\["
t_CLOSE = r"\]"
t_SLASH = r"/"
t_TEXT = r"[^/^\[^\].]+"
t_BOLD_OPEN = r"\[b\]"
t_BOLD_CLOSE = r"\[/b\]"
t_ITALIC_OPEN = r"\[i\]"
t_ITALIC_CLOSE = r"\[/i\]"


def t_error(t):
    print "Illegal character '%s'" % t.value[0], t.lexer.skip(1)

def t_newline(t):
    r'\n+'
    t.lexer.lineno += t.value.count("\n")


class node(object):
    def __init__(self, parent, tag=None, data=None):
        self.tag = tag
        self.children = []
        self.parent = parent
        self.data = data
        if parent is not None:
            parent.children.append(self)
    def show(self, indent):
        if self.tag is not None:
            print("%*s[%s]" % (indent, "", self.tag))

        for i in self.children:
            i.show(indent+2)

        if self.data is not None:
            print("%*s'%s'" % (indent, "", self.data) )

        if self.tag is not None:
            print("%*s[/%s]" % (indent, "", self.tag))

        
def p_post(p):
    '''post : data'''

def p_data_TEXT(p):
    '''data : TEXT
            | OPEN
            | CLOSE
            | SLASH'''
    print("text: '%s' " % p[1])
    global cur
    node(cur, data=p[1])
    
def p_data_other(p):
    '''data : tags
            | data data'''

def p_tags(p):
    '''tags : tag
            | tag tag'''

def p_tag(p):
    '''tag : bold
           | italic'''

def p_bold(p):
    '''bold : bold_open data bold_close
            | bold_open bold_close'''

def p_bold_open(p):
    '''bold_open : BOLD_OPEN'''
    print("bold_open")
    global cur
    cur = node(cur, tag='b')

def p_bold_close(p):
    '''bold_close : BOLD_CLOSE'''
    print("bold_close")
    global cur
    cur = cur.parent


def p_italic(p):
    '''italic : italic_open data italic_close
              | italic_open italic_close'''

def p_italic_open(p):
    '''italic_open : ITALIC_OPEN'''
    print("italic_open")
    global cur
    cur = node(cur, tag='i')


def p_italic_close(p):
    '''italic_close : ITALIC_CLOSE'''
    print("italic_close")
    global cur
    cur = cur.parent

def p_error(p):
    if p is None:
        raise Exception("Syntax error at end of file -- good luck")
    else:
        raise Exception("Syntax error at '%s'" % p)


root = node(None)
global cur
cur = root


lex.lex()
lex.input(teststr)

print("------LEX LUTHOR------")
for tok in iter(lex.token, None):
    print repr(tok.type), repr(tok.value)
print("")

print("------YACC YACC------")
yacc.yacc()
print yacc.parse(teststr)
print("")

print("------GREEN TREE------")
root.show(0)
sieht ca so aus:
Quellcode:------LEX LUTHOR------
'BOLD_OPEN' '[b]'
'TEXT' 'test'
'BOLD_CLOSE' '[/b]'
'TEXT' ' '
'OPEN' '['
'TEXT' 'b '
'CLOSE' ']'
'TEXT' ' '
'OPEN' '['
'SLASH' '/'
'CLOSE' ']'
'TEXT' ' 123 '
'BOLD_OPEN' '[b]'
'TEXT' ' 234 '
'BOLD_CLOSE' '[/b]'
'TEXT' ' '
'ITALIC_OPEN' '[i]'
'BOLD_OPEN' '[b]'
'ITALIC_OPEN' '[i]'
'ITALIC_CLOSE' '[/i]'
'BOLD_CLOSE' '[/b]'
'ITALIC_CLOSE' '[/i]'

------YACC YACC------
bold_open
text: 'test'
bold_close
text: ' '
text: '['
text: 'b '
text: ']'
text: ' '
text: '['
text: '/'
text: ']'
text: ' 123 '
bold_open
text: ' 234 '
bold_close
text: ' '
italic_open
bold_open
italic_open
italic_close
bold_close
italic_close
None

------GREEN TREE------
  [b]
    'test'
  [/b]
  ' '
  '['
  'b '
  ']'
  ' '
  '['
  '/'
  ']'
  ' 123 '
  [b]
    ' 234 '
  [/b]
  ' '
  [i]
    [b]
      [i]
      [/i]
    [/b]
  [/i]
Der Kram kann nur i und b, da war ich faul.

Aufgabe jetzt ist ein Beispiel was syntaktisch korrekter bbcode ist, nur i und b verwendet, nicht geparsed werden kann, und kein lamer Bug ist.

--

Du musst Deine Bandbreite verbreitern, damit du breiter wirst von der Bandbreite her und ein breiteres Publikum ansprechen kannst.

zum Seitenanfang zum Seitenende Profil || Suche
018
14.10.2010, 11:14
the_Crow



Was hab ich da mit meiner Frage nur ausgelöst ^^

--

www.the-crow.at - meine persönliche Website | TibiaGerman | Twitter | Wiaschtlsiada

zum Seitenanfang zum Seitenende Profil || Suche
019
18.10.2010, 13:14
LeJean



Danke default.
Ich wollte Chronial gerade fragen, ob er mit lex und yacc (bzw. bison) schonmal eine vernünftige lexikographische Analyse und nen Syntaxparser gebaut hat. Dann kann ich mir meine Ausführungen ja jetzt sparen.

Der Übersichtlichkeit halber die Produktionsregeln von default, die validen BB-Code mit b und i schön sauber auflösen. Das Alphabet ist übrigens nur die Menge der Terminalsymbole, und die entsprechen nicht 1:1 dem UTF8-Satz. Unten ist "TEXT" z.B. ein Terminalsymbol und kann aus beliebig vielen Textzeichen bestehen, genauso ist BOLD_OPEN das Terminalsymbol, dessen textuelle Repräsentation "[b]" ist.

Quellcode:post : data

data : TEXT
     | OPEN
     | CLOSE
     | SLASH
    
data : tags
     | data data

tags : tag
     | tag tag

tag : bold
    | italic

bold : bold_open data bold_close
     | bold_open bold_close

bold_open : BOLD_OPEN

bold_close : BOLD_CLOSE

italic : italic_open data italic_close
       | italic_open italic_close

italic_open : ITALIC_OPEN

italic_close : ITALIC_CLOSE
Genug der Klugscheißerei. Aber die Problemstellung dieses Threads ist ja ohnehin schon gelöst.

--


Dieser Beitrag wurde am 18.10.2010 um 13:24 von LeJean bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche