Regex für propitären Code > HTML

  1. Saski

    Saski Thread Starter MacUser Mitglied

    Mitglied seit:
    06.02.2005
    Beiträge:
    644
    Zustimmungen:
    0
    Huhu! :)

    Bin grad am überlegen. Was ist effektiver? Ich will eigene [bla]-Tags durch <bla>-Tags (HTML) ersetzen. Nach [bla]*[/bla] suchen, oder einmal nach [bla] und dann nach [/bla]?

    Saski bunny
     
    Saski, 21.05.2005
    #1
  2. Theremin

    Theremin MacUser Mitglied

    Mitglied seit:
    16.12.2003
    Beiträge:
    100
    Zustimmungen:
    1
    So mache ich es.

    PHP:
        function reg_express(&$html) {
            
    $html htmlspecialchars($html);
            
    $html ereg_replace("\r","",$html);
            
    $html ereg_replace("\n\n","</p><p>",$html);
            
    $html ereg_replace("\n","<br />",$html);
            
    $html ereg_replace("\[TAB]","<ul>",$html);
            
    $html ereg_replace("\[TABSTOP]","</ul>",$html);
            
    $html ereg_replace("\[L]","<li>",$html);
            
    $html ereg_replace("\[EL]","</li>",$html);
            return 
    $reg_express;
            }
     
    Theremin, 21.05.2005
    #2
  3. maceis

    maceis MacUser Mitglied

    Mitglied seit:
    24.09.2003
    Beiträge:
    16.696
    Zustimmungen:
    602
    Mit regexes in PHP habe ich ehrlich gesagt nicht so viel Erfahrung.
    Unter Perl würde mit [bla]*[/bla] das Problem entstehen, dass der * gierig (greedy) ist.
    Das heisst [bla]*[/bla] würde beim folgenden Beispiel komplett matchen:
    Code:
    [Color=blue][bla][/COLOR]eins[/bla] was anderes [bla]zwei[/bla]noch was
    neue Zeile [bla]drei[/bla]
    und so weiter
    [bla]vier[COLOR=blue][/bla][/COLOR]
    Ist vielleicht nicht das, was Du gerne hättest.
    Wie das unter PHP aussieht, kann ich nicht sicher sagen, aber ich fürchte ähnlich.

    HTH
     
    maceis, 21.05.2005
    #3
  4. Brandhoff

    Brandhoff MacUser Mitglied

    Mitglied seit:
    07.02.2004
    Beiträge:
    401
    Zustimmungen:
    0
    Saski, findet das auf dem Server oder lokal statt?

    Vorausgesetzt, deine Syntax folgt dem Prinzip "Spitze Klammer auf" ["Slash"] ["dein_tag"] "Spitze Klammer zu", wäre es am effizientesten, nur den Teil nach dem (optionalen) Slash zu ersetzen, also statt:
    PHP:
    $html ereg_replace("<blub>","<li>",$html);
    $html ereg_replace("</blub>","</li>",$html);
    einfach nur
    PHP:
    $html ereg_replace("blub>","li>",$html);
    ersetzt alle einleitenden und schließenden Tags in einem Rutsch.

    (Beispiel von dir wäre nett!)

    cheers

    PS: bei möglichen Überschneidungen wie <blub> und <blablub> müsste <blablub> natürlich zuerst geparst werden ...
     
    Brandhoff, 21.05.2005
    #4
  5. Nogger

    Nogger MacUser Mitglied

    Mitglied seit:
    03.08.2004
    Beiträge:
    367
    Zustimmungen:
    0
    Nogger, 21.05.2005
    #5
  6. Ulfrinn

    Ulfrinn MacUser Mitglied

    Mitglied seit:
    30.01.2005
    Beiträge:
    6.684
    Zustimmungen:
    588
    Du solltest RegEx verwenden, weil diese dann Fehler im Properitärcode abfangen können. Wenn du z. B. auf
    Code:
    [b][i]hello, world[/ b]
    ein normales str_replace() losläßt, wird daraus:
    Code:
    <b><i>hello, world</b>
    Und das ist kein gültiges HTML. Ein regulärer Ausdruck würde dann nur
    Code:
    <b>[i]hello, world</b>
    also gültiges HTML erzeugen.

    Hinweis: Im ersten Beispiel oben mußte ich einen Leerschritt beim schliessenden Tag setzen, weil die Forumssoftware das leider als BBCode interpretiert hat – selbst in einem Code-Block.
     
    Ulfrinn, 21.05.2005
    #6
  7. Saski

    Saski Thread Starter MacUser Mitglied

    Mitglied seit:
    06.02.2005
    Beiträge:
    644
    Zustimmungen:
    0
    Danke für eure Antworten! Werd das definitiv mit ein paar Regexen machen, geht doch viel einfacher, als da jetzt noch Irgendwas von PEAR einzubinden *g*

    @Brandhoff: Es muss aus Kompatibilitätsgründen mit eckigen Klammern sein. Wie wär's damit?
    PHP:
    $html eregi_replace("\[(.*?)b\]","<\\1b>",$html); 
    (Hab's jetzt nicht getestet)

    @Ulfrinn: Ja, das ist natürlich ein Vorteil. Aber dauert das Parsen dann nicht doppelt so lange? :(

    @Maceis: Das Fragezeichen im Schnipsel oben sorgt (soviel ich weiss) dafür, dass es nicht greedy ist :)
     
    Saski, 21.05.2005
    #7
  8. Ulfrinn

    Ulfrinn MacUser Mitglied

    Mitglied seit:
    30.01.2005
    Beiträge:
    6.684
    Zustimmungen:
    588
    Bzgl. der Geschwindigkeit mußt du dir wahrscheinlich nicht allzuviele Gedanken machen. Du kannst ja einfach mal testen, wie lange PHP für so eine Seite braucht – Du wirst sehen, daß das relativ schnell ist. Vorausgesetzt, du willst nicht bei jedem Aufruf die Bibel parsen. ;)
     
    Ulfrinn, 21.05.2005
    #8
  9. maceis

    maceis MacUser Mitglied

    Mitglied seit:
    24.09.2003
    Beiträge:
    16.696
    Zustimmungen:
    602
    Ja, in Perl ist das zumindest so.
    Da musst Du allerdings dafür sorgen, dass alle vorkommen ersetzt werden und nicht nur das erste.
     
    maceis, 21.05.2005
    #9
  10. Nogger

    Nogger MacUser Mitglied

    Mitglied seit:
    03.08.2004
    Beiträge:
    367
    Zustimmungen:
    0
    Wenn damit Code umgewandelt werden soll, der aus unsicherer Quelle kommt (Benutzereingaben), dann würde ich flugs auf Pear setzen, bevor du dir eine XSS Schwachstelle einbaust. Der Code in Pear unterliegt Qualitätsrichtlinen.

    [script src="http://www.boese.de/attacke.js"></script> <foob]
     
    Nogger, 21.05.2005
    #10
Die Seite wird geladen...
Ähnliche Themen - Regex propitären Code
  1. nonpareille8
    Antworten:
    2
    Aufrufe:
    1.070
    nonpareille8
    15.08.2014
  2. silentx
    Antworten:
    4
    Aufrufe:
    645
    silentx
    27.07.2012
  3. apfelmaennchen
    Antworten:
    0
    Aufrufe:
    926
    apfelmaennchen
    29.08.2010
  4. Reimer
    Antworten:
    5
    Aufrufe:
    470
    solidFlex
    06.06.2009
  5. sideshow
    Antworten:
    5
    Aufrufe:
    545
    sideshow
    18.03.2008