+ Antworten
Ergebnis 1 bis 8 von 8

Thema: 'BB-Codes' etwas anders geparst...

  1. #1
    seb
    seb ist offline
    TP-Veteran seb bringt sich richtig ein seb bringt sich richtig ein
    Registriert seit
    Jan 2002
    Beiträge
    1.741

    'BB-Codes' etwas anders geparst...

    Da hier ja immer wieder mal Diskussionen über die Umsetzung von 'BB-Code'-Formatierung geführt werden und ich jetzt selbst sowas gebrauchen konnte, hab jetzt mal eine eigene Parsing-Funktion für sowas geschrieben.

    Anders als die 'Standard-Lösung' kommt meiner mit einem einzigen preg_replace für alle Tags aus (die Schleife um den preg-match()-Aufruf wird für verschachtelte Tags benötigt).

    Es gibt nur ein Muster [TAG=ARGUMENT]INNERER_STRING[/TAG] (wobei =ARGUMENT optional ist), jedes Vorkommen wird mittels einer Callback-Funktion ausgetauscht, an die TAG, INNERER_STRING und ARGUMENT als übergeben werden.
    Dort drin gibt's ein switch, das die Argumente auswertet und die entsprechende Ausgabe vornimmt.

    Was haltet ihr von dem Ansatz?

    Es ist umständlicher als einfach für jeden vorgesehenen Tag ein Pattern auszutauschen, aber ich finds so trotzdem irgendwie eleganter.

    PHP-Code:
    function bbcode_replace($string)
    {
        while(
    $old_string != $string)
        {
            
    $old_string $string;
            
    $string preg_replace('{\[(\w+)((=)(.+)|(.*))\]((.|\n)*)\[/\\1\]}Ue'"bbcode_process('\\1', '\\6', '\\4');"$string);
        }

        return 
    $string;
    }


    function 
    bbcode_process($tag$inner_string$argument false)
    {
        
    ob_start('ob_gzhandler');

        switch(
    $tag)
        {
            case 
    'b':
            case 
    'i':
            case 
    'u':
                echo 
    "<$tag>$inner_string</$tag>";
                break;

            case 
    'code':
                echo 
    '<b>Code:</b><hr /><pre style="font-size:12px;">' $inner_string '</pre><hr />';
                break;

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

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

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

            case 
    'image':
                echo 
    '<img src="' $argument '" />';
                break;

            case 
    'quote':
                echo 
    '<b>Quote:</b><hr />' $inner_string '<hr />';
                break;

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

        
    $buffer ob_get_contents();
        
    ob_end_clean();

        return 
    $buffer;


  2. #2
    TP-Specialist Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Avatar von Stuck Mojo
    Registriert seit
    Feb 2001
    Ort
    Helmstedt/Wolfsburg
    Beiträge
    4.108
    Schickes Ding, nur wozu ist die while-Schleife da? Ersetzt preg_replace nicht alle Treffer?

  3. #3
    TP-Veteran holunda macht alles soweit korrekt Avatar von holunda
    Registriert seit
    Oct 2001
    Ort
    Oberau
    Beiträge
    1.867
    PHP-Code:
            case 'b':
            case 
    'i':
            case 
    'u':
                echo 
    "<$tag>$inner_string</$tag>";
                break; 
    is aber nicht sehr schön oder?
    ich mein eine $var in "" setzen.

    Was ist eigentlich falsch daran?
    Alex

  4. #4
    TP-Specialist Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Avatar von Stuck Mojo
    Registriert seit
    Feb 2001
    Ort
    Helmstedt/Wolfsburg
    Beiträge
    4.108
    Original geschrieben von holunda

    is aber nicht sehr schön oder?
    ich mein eine $var in "" setzen.

    Was ist eigentlich falsch daran?
    Alex
    nix

  5. #5
    TP-Veteran fettmme bringt sich richtig ein fettmme bringt sich richtig ein Avatar von fettmme
    Registriert seit
    Feb 2002
    Beiträge
    1.491
    Sieht schick aus. Ich werd's die Tage mal auf meiner Seite ausprobieren. Danke
    class GetProfileCustomerEntityReceiverInformationReceiverAndProgrammingInforma...{
    public function __construct(){ if(!$this) die(' '); } }
    http://www.thedailywtf.com/

  6. #6
    TP-Veteran holunda macht alles soweit korrekt Avatar von holunda
    Registriert seit
    Oct 2001
    Ort
    Oberau
    Beiträge
    1.867
    hab mal irgendwo aufgeschnappt dass man das so machen soll:

    PHP-Code:
    echo "<".$tag.">".$inner_string."</".$tag.">"
    und da wollte ich fragen was der Unterschied ist ...

  7. #7
    TP-Specialist Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Stuck Mojo ist ein richtiges Arbeitstier - DANKE Avatar von Stuck Mojo
    Registriert seit
    Feb 2001
    Ort
    Helmstedt/Wolfsburg
    Beiträge
    4.108

  8. #8
    seb
    seb ist offline
    TP-Veteran seb bringt sich richtig ein seb bringt sich richtig ein
    Registriert seit
    Jan 2002
    Beiträge
    1.741
    Schickes Ding, nur wozu ist die while-Schleife da? Ersetzt preg_replace nicht alle Treffer?
    Jein. Ineinander verschachtelte Vorkommen kann es nicht mit einem Aufruf komplett austauschen, daher ist die Schleife notwendig:

    PHP-Code:
    [b][i]Dieser Text ist fett und kursiv[/i]/b]
    Nach ersten Aufruf:
    <
    b>[i]Dieser Text ist fett und kursiv[/i]</b>
    Verstehscht?
    ==> 
    nach 2. Aufruf:
    <
    b><i>Dieser Text ist fett und kursiv</i></b
    hab mal irgendwo aufgeschnappt dass man das so machen soll:
    Wenn man's ganz genau nimmt, hast Du recht.
    Variablen in Strings zu parsen,
    kostet PHP theoretisch ein klitzekleinesbisschen mehr Zeit, als den String aus 'festen' Werten und Variablen zusammenzusetzen.

    Der Unterschied dürfte allerdings in den allermeisten Fällen derart gering sein, dass man der Übersichtlichkeit des Codes auch mal Vorrang geben kann.



    Und nochwas:

    Falls ihr das benutzen wollt, schmeißt den Krams mit dem Output Buffering raus. Mir fiel im Nachhinein ein, das ist in dem Fall völlig unnötig ist.

    Ich hatte den Output Buffer erst 'aus Gewohnheit' verwendet, weil ich eine sehr ähnliche Funktion habe, die mit includes arbeitet (und da braucht mans).

    Hier reichts völlig aus, statt den echos die Replacement-Strings in eine Variable zu schreiben und die zurückzugeben.

+ Antworten

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

     

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51