mmofacts.com

Parser gehts noch kürzer?

gepostet vor 18 Jahre, 1 Monat von Kapsonfire

function bbcodeparser($inhalt)
{
$inhalt = eregi_replace('(\[url\])(.*)(\[/url\])','\2',$inhalt);
$inhalt = eregi_replace('(\[img\])(.*)(\[/img\])','',$inhalt);
$inhalt = eregi_replace('(\[qoute\])(.*)(\[/qoute\])','\2',$inhalt);
$inhalt = eregi_replace('(\[user\])(.*)(\[/user\])','\2',$inhalt);
return $inhalt;
}
function remove_htmlcodes($variable) // begin remove_htmlcodes()
{
$array = array('<' => '<', '>' => '>');
$vari = strtr($variable, $array);
return $vari;
} // end remove_htmlcodes()
function text_parse($variable) //begin text_parse()
{
$variable = remove_htmlcodes($variable);
$variable = bbcodeparser($variable);
$variable = nl2br($variable);
return $variable;
} //end text_parse()

nur ne frage.... gibts ne methode die schneller geht für den compiler?
gepostet vor 18 Jahre, 1 Monat von TheUndeadable
Du hast schwere Sicherheitslücken drin, da man als Url auch ein [u.rl]" onMouseOver="schick mir dein Login" "[/u.rl] übermitteln kann. Das gleiche bei den Bildern
gepostet vor 18 Jahre, 1 Monat von Kapsonfire
' und " werden später noch rausgefiltert dann ist das nichtmehr möglich
frage wurde aber nicht beantwortet
gepostet vor 18 Jahre, 1 Monat von LifeStyle
Also ich weiß nicht ob es dir helfen kann, aber so habe ich es bei mir:

function text_replace($text) {
$text = str_replace("", "", $text);
$text = str_replace("", "", $text);
$text = str_replace("[scroll]", "", $text);
$text = str_replace("[/scroll]", "", $text);
$text = str_replace("[fade]", "", $text);
$text = str_replace("[/fade]", "", $text);
$text = str_replace("[glow]", "", $text);
$text = str_replace("[/glow]", "", $text);
$text = str_replace("[shadow]", "", $text);
$text = str_replace("[/shadow]", "", $text);
$text = str_replace("[highlight]", "", $text);
$text = str_replace("[/highlight]", "", $text);
$text = str_replace("[li]", "
  • ", $text);

  • $text = str_replace("[/li]", "", $text);
    $text = str_replace("[br]", "
    ", $text);
    $text = str_replace("[/br]", "
    ", $text);
    $text = str_replace("", "", $text);
    $text = str_replace("", "", $text);
    $text = str_replace("", "", $text);
    $text = str_replace("", "", $text);
    $text = eregi_replace("\\[url\\]www.([^\\[]*)\\[/url\\]","\\1",$text);
    $text = eregi_replace("\\[url\\]([^\\[]*)\\[/url\\]","\\1",$text);
    $text = eregi_replace("\\[url=\"","[url=\"",$text);
    $text = eregi_replace("\\"\\]","\"]",$text);
    $text = eregi_replace("\\[url=\"([^\\[]*)\"\\]([^\\[]*)\\[\\/url\\]", "\\2", $text);
    $text = eregi_replace("\\[url=([^\\[]*)\\]([^\\[]*)\\[\\/url\\]", "\\2", $text);
    $text = eregi_replace("\\[email\\]([^\\[]*)\\[/email\\]", "\\1", $text);
    $text = eregi_replace("\\[email=([^\\[]*)\\]([^\\[]*)\\[/email\\]", "\\2", $text);
    $text = str_replace("[center]", "", $text);
    $text = str_replace("[/center]", "", $text);
    $text = str_replace("[*]", "
  • ", $text);

  • $text = str_replace("
      ", "
      ", $text);

    $text = str_replace("", "", $text);
    return $text;
    }
    gepostet vor 18 Jahre, 1 Monat von Störti
    @ Lifestyle:
    Was passiert, wenn einer nur [b.] eingibt, aber das[/b.] vergisst?
    gepostet vor 18 Jahre, 1 Monat von planetenkiller
    also ich setzte den hier ein:
    christian-seiler.de/projekte/php/bbcode/index.html
    ich finde den mega cool, man kann sehr viel einstellen, und ist auch relativ sicher bei richtigen Einstellungen.
    der ist zwar nicht auf Geschwindigkeit ausgelegt, dafür sorgt er für korekte verschachtelung usw.
    gepostet vor 18 Jahre, 1 Monat von Fornax
    Ich weiß nicht, ob es was bringt, aber man kann den Großteil auch zu einer Funktion zusammenfassen. Das wird halt leider etwas unübersichtlich

    function text_replace($text) {
    $array_search = array("", "", "[scroll]", "[/scroll]");
    $array_replace = array("", "", "", "");

    $text = str_replace($array_search , $array_replace, $text);

    return $text;
    }
    EDIT: Ich hab jetzt nurmal die ersten genommen, zum verdeutlichen
    gepostet vor 18 Jahre, 1 Monat von Störti
    Ich wiederhole noch einmal, es ist wichtig, dass geöffnete Tags auch wieder geschlossen werden, es muss also für jedes gefundene öffnende Tag auch ein schliessendes Tag gefunden werden, ist dies nicht der Fall, sollte die betreffende Formatierung ignoriert werden. Ich meine zwar gelesen zu haben, dass ein geöffnetes Tag vor dem nächsten schliessenden Tag (egal was da geschlossen wird) immer geschlossen wird, sollte dies noch nicht der Fall gewesen sein, aber korrekt ist ein nicht geschlossenes Tag definitiv nicht.
    gepostet vor 18 Jahre, 1 Monat von Tetha
    Es ist nur leider so, dass derartige Strukturen nicht nur mit regulaeren Ausdruecken beschrieben werden koennen. Kein generischer Regex wird sowohl
     foo  bar   baz 
    als auch
     foo
    vernuenftig parsen, d.h., geoeffnete und nicht geschlossene Tags ignorieren und beliebige Verschachtelung akzeptieren (wem das erste Beispiel zu konstruiert erscheint, denke sich halt noch ein
    um das innere oder whatever). Das kann man nur mit einer Grammatik beschreiben, welche dann durch einen geeigneten Parser erkannt werden muss.

    gepostet vor 18 Jahre, 1 Monat von progs
    Dann sollten meiner Meinung nach, nicht geschlossene Tags auch nicht geparst werden, da es ansonsten zu unschönen Ergebnissen kommen kann, welche schlimmsten Fall zu einer unleserlichkeit des gesamten Beitrags bzw. gesamten Seiten (wenn es wirklich schlimm ist) kommen kann.
    gepostet vor 18 Jahre, 1 Monat von Störti
    Ups, hab das Frameset ignoriert...
    gepostet vor 18 Jahre, 1 Monat von TheUndeadable
    Hinweis:
    13 /***************************************************************************
    14 *
    15 * This program is free software; you can redistribute it and/or modify
    16 * it under the terms of the GNU General Public License as published by
    17 * the Free Software Foundation; either version 2 of the License, or
    18 * (at your option) any later version.
    19 *
    20 ***************************************************************************/
    Wer den Code übernimmt, MUSS sein Projekt unter die GPL stellen.
    gepostet vor 18 Jahre, 1 Monat von progs
    Niemand sagt, dass man den Code übernehmen muss. Man kann sich dort ja mal anschauen wie das das machen und dann selber eins programmieren. Da dort evtl. auch phpBB-Funktionene verwendet werden, wird es eh nicht so sinnvoll sein, das zu kopieren.
    gepostet vor 17 Jahre, 10 Monate von Kapsonfire
    mir ist grad aufgefallen das wenn ich z.B.
    [red] bla [/red] [blue] bla [/blue] [red] bla [/red]

    eingebe
     bla [/red]  bla  [red] bla 

    rauskommt
    wie kann ich das verhindern...
    also das auch wirklich
     bla   bla   bla 

    rauskommt?
    //edit mir fällt gerade auf falscher thread^^
    gepostet vor 17 Jahre, 10 Monate von Nuky
    das ist der "greedy" modifikator der regular expressions.
    sie wollen alle soviel text wie sie kriegen können, leicht erklärt. im endeffekt bedeutet das für dich ein "U" ganz zum schluss aller einträge im array für den ersten parameter.
    php - manual, ganz unten bei ereg_replace:
    Tipp: Die Funktion preg_replace(), die eine zu Perl kompatible Syntax regulärer Ausdrücke verwendet, ist häufig die schnellere Alternative zu ereg_replace().
    dein code würde demnach so aussehen:
    $inhalt = preg_replace('(#\[url\])(.*)(\[/url\])#U','\2',$inhalt);
    wobei der code dabei noch immer ein bisschen mit der kirche ums kreuz ist, leichter lesbar wäre es so:
    $inhalt = preg_replace('#\[url\](.*)\[/url\]#U','\1', $inhalt);
    ich hoffe das muster ist für dich klar erkennbar.. kann dir auf wunsch auch meine funktion dafür bereitstellen..
    gepostet vor 17 Jahre, 10 Monate von Kapsonfire
    danke für den eintrag
    du hast mir sehr geholfen
    für was steht eigentlich das U?
    also was es bewirkt ist mir klar aber für was steht das?
    gepostet vor 17 Jahre, 10 Monate von Nuky
    bitte gern, freut mich!
    "U" steht für "Ungreedy", und bewirkt das selbe wie ein "?" nach jedem pattern. mit dem "U" modifikator würde ein "?" das pattern wieder greedy machen.
    prinzipiell bedeutet das, das alle patterns (die * und so..) nicht versuchen so viel text wie möglich "zu bekommen", sondern so wenig wie möglich.
    gepostet vor 17 Jahre, 10 Monate von Kapsonfire
    okay danke
    gepostet vor 17 Jahre, 8 Monate von Kapsonfire
    kleine frage noch^^
    wieso geht der zeilenumbruch damit nicht?
    $inhalt = preg_replace('#\[b\](.*)\[/b\]#U','\1', $inhalt);
    gepostet vor 17 Jahre, 8 Monate von Nuky
    du meinst wahrscheinlich, warum dir bei der ausgabe dann kein zeilenumbruch anzeigt wird, oder?
    $inhalt = preg_replace('#\n#','
    ', $inhalt);
    wäre in dem all deine lösung, ansonsten spezifiziere deine frage bitte etwas genauer..
    gepostet vor 17 Jahre, 8 Monate von Rokks
    Nuky gibt Dir die Lösung bereits vor.
    Du erhälst keinen Zeilenumbruch, weil Du diesen nicht angibst bzw. erzeugst.
    gepostet vor 17 Jahre, 8 Monate von TheUndeadable
    > $inhalt = preg_replace('#\n#','
    ', $inhalt);
    $inhalt = nl2br($inhalt); ??
    gepostet vor 17 Jahre, 8 Monate von Kapsonfire
    das nl2br weiss ich selber
    wenn ich z.B. den code:
     fettschrift

    mit mir eingebe wird es nicht ersetzt...
    derzeit sieht der quellcode so aus

    function bbcode($inhalt)
    {
    $inhalt = preg_replace('#\[url\](.*)\[/url\]#U','\1', $inhalt);
    $inhalt = preg_replace('#\[url=(.*)\](.*)\[/url\]#U','\2', $inhalt);
    $inhalt = preg_replace('#\[b\](.*)\[/b\]#U','\1', $inhalt);
    return $inhalt;
    }
    //und abgefragt wird es mit
    bbcode(nl2br($user[like]))
    gepostet vor 17 Jahre, 8 Monate von TBT
    dir fehlt der Modifier s damit der eguläre Ausdruck über mehrere Zeilen sucht, also
    # ... #Us
    gepostet vor 17 Jahre, 8 Monate von Kapsonfire
    thx
    gepostet vor 17 Jahre, 8 Monate von Nuky
    ja, da hätt ich bei meiner vorigen antwort besser aufpassen sollen, danke tbt
    gepostet vor 17 Jahre, 8 Monate von raufaser
    Und falls jetzt noch gefragt wird, warum es mit Großbuchstaben nicht geht: Parameter "i". Also "siU".
    z.B. Übschriften einer HTML Daten finden, egal ob Groß- oder Kleinschreibung:
    preg_match_all( "/\(.*)\<\/h1\>/siU", $html, $matches );
    RegEx sind übrigens sehr mächtig und eine eingehende Beschäftigung mit den Thema wirklich lohnenswert.
    Gruß,
    Marc
    gepostet vor 17 Jahre, 8 Monate von Kampfhoernchen
    Oh ja. Ich bekomme von Regenechsen zwar immer kopfschmerzen, aber mal davon abgesehen sind sie ein extrem mächtiges Werkzeug.
    gepostet vor 17 Jahre, 8 Monate von Toby
    Ich find da das "Regular Expression Tester" Addon fürn Firefox sehr toll. Gibt wesentlich weniger Kopfschmerzen damit.
    gepostet vor 17 Jahre, 8 Monate von Kampfhoernchen
    Oder das Büchchen "RegEx-Spicker".
    So wie ich das mag: Kurz, prägnant, trotzdem verständlich.

    Auf diese Diskussion antworten