Hendrik: Eigenen BB-Code mit PHP schreiben?

Hey!

Ich möchte auf meiner Webseite meinen Besuchern anbieten, ihren Beitrag zu formatieren, natürlich mit BB-Code. Da habe ich dann so angesetzt:

  
function bbcode ($text) {  
  $ergebnis = htmlentities($text);  
  $ergebnis = str_replace("[b]","<b>",$ergebnis);  
  $ergebnis = str_replace("[/b]","</b>",$ergebnis);  
  $ergebnis = str_replace("[i]","<i>",$ergebnis);  
  $ergebnis = str_replace("[/i]","</i>",$ergebnis);  
  $ergebnis = str_replace("[u]","<u>",$ergebnis);  
  $ergebnis = str_replace("[/u]","</u>",$ergebnis);  
  $ergebnis = str_replace ("|-","&ndash;",$ergebnis);  
  $ergebnis = str_replace ("[q]","&raquo;",$ergebnis);  
  $ergebnis = str_replace ("[/q]","&laquo;",$ergebnis);  
  $ergebnis = str_replace ("[qs]","&rsaquo;",$ergebnis);  
  $ergebnis = str_replace ("[/qs]","&lsaquo;",$ergebnis);  
  $ergebnis = str_replace ("|'","&rsquo;",$ergebnis);  
  $ergebnis = str_replace ("[r]","&reg;",$ergebnis);  
  return $ergebnis;  
}  

Solche Elemente wie <b>, <u> und <i> sind ja ziemlich leicht, aber wie kann ich z.B. wie in diesem Forum hier auch meinen Besuchern anbieten, auf andere Internetseiten zu verlinken, so dass die Besucher dann nur so etwas wie hier auch schreiben müssen:
<http://de.selfhtml.org@....damit man's sehen kann>

Krieg ich das auch mit str_replace hin? Ich denke eigentlich nicht. Wie dann? Würde das Problem gerne mit PHP lösen!

Ich habe mir die aktuelle Version der BB-Code-Parserklasse von Christian Seiler heruntergeladen, allerdings weiß ich nicht, wie ich die jetzt benutzen soll?

--
-------------------
Zur Info: Ich habe leider nur PHP 4.4.2 zur Verfügung!
-------------------
ie:% fl:| br:> va:) ls:[ fo:) rl:( n4:° ss:| de:> js:| ch:? sh:( mo:) zu:)
SELFCode Decoder
  1. Hallo Henrik,

    Ich habe mir die aktuelle Version der BB-Code-Parserklasse von Christian Seiler heruntergeladen, allerdings weiß ich nicht, wie ich die jetzt benutzen soll?

    Hast Du denn schonmal in die Dokumentation geschaut?

    Viele Grüße,
    Christian

    --
    "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
  2. Hallihallo!

    Für solche Links greife ich auch reguläre Ausdrücke zurück:

      
    $tags = array (  
       "/\[link:(.*)@text=(.*)\]/Ui"    => "<a href=\"$1\">$2</a>",  
       "/\[link:(.*)\]/Ui"              => "<a href=\"$1\">$1</a>",  
       "/\[bild:(.*)@text=(.*)\]/Ui"    => "<img src=\"$1\" alt=\"$2\" title=\"$2\">",  
       "/\[bild:(.*)]/Ui"               => "<img src=\"$1\" alt=\"\">"  
    );  
      
    foreach ($tags as $getippt => $gezeigt) {  
       $nachricht = preg_replace($getippt, $gezeigt, $nachricht);  
    }  
      
    
    

    Wichtig ist dabei, daß für jedes "Tag" einmal die volle, und einmal die gekürzte Version enthalten ist. Dabei muss immer zuerst die volle Version ersetzt werden, sonst kommt logischerweise Murks dabei raus.

    Mir ist übrigens klar, daß diese Lösung nicht ansatzweise so gut ist wie die BBCode- Parserklasse, aber ich bin der Meinung, daß dieser Ansatz zumindest für verhältnismäßig kleine Dinge wie z.B. eine Shoutbox o.Ä. vollkommen ausreicht.

    Ich hoffe, das hilft Dir weiter...

    Viele liebe Grüße,
    Der Dicki

  3. Hey und hallo Hendrik,

    Solltest du die Dokumentation zur BB-Parser-Klasse gefunden haben, dann lies dich mal da ein ... Sie (die Klasse) hat den Vorteil, dass sie die BBCode-Tags nicht blind ersetzt. Mit str_replace() und preg_replace() gebastelte BBCode-Ersetzungen haben nämlich den Nachteil, dass man als Benutzer damit schönen Unfug anstellen kann. Das beginnt bei nicht validem HTML, weil man bestimmte Tags unpassend ineinander schachteln kann. Weiter gehts mit einem "verhauenem" Layout, weil einfach das schließende Tag vergessen wurde. Zumindest die letztere Gefahr kann man minimieren, wenn man für die Formatierung CSS-Klassen einsetzt und BBCode-Bereiche in eigene Container (bspw. DIVs) sperrt.

    Trotzdem finde ich die Variante mit preg_replace() nicht ganz schlecht, man kann zumindest beim Experimentieren damit eine ganze Menge lernen. Folgendes Konstrukt

      
    $ergebnis = preg_replace('/\[(\/?)([biuq])\]/i', '<$1$2>', $text);  
    
    

    ... ersetzt zum Beispiel 10 Zeilen deines Quelltextes:

    $ergebnis = str_replace("[b]","<b>",$ergebnis);
      $ergebnis = str_replace("[/b]","</b>",$ergebnis);
      $ergebnis = str_replace("[i]","<i>",$ergebnis);
      $ergebnis = str_replace("[/i]","</i>",$ergebnis);
      $ergebnis = str_replace("[u]","<u>",$ergebnis);
      $ergebnis = str_replace("[/u]","</u>",$ergebnis);

    $ergebnis = str_replace ("[q]","&raquo;",$ergebnis);
      $ergebnis = str_replace ("[/q]","&laquo;",$ergebnis);
      $ergebnis = str_replace ("[qs]","&rsaquo;",$ergebnis);
      $ergebnis = str_replace ("[/qs]","&lsaquo;",$ergebnis);

    q-Tags kann man in HTML schachteln. Ein aktueller Browser (oder/und ein gutes CSS) setzt dann die entsprechenden Gänsefüßchen automatisch.

    Und wenn du später noch auf die Idee kommst, Listen formatieren zu wollen, dann erweiterst du den RegEx eben ein bisschen:

      
    $ergebnis = preg_replace('/\[(\/?)([biuq]|li|ul)\]/i', '<$1$2>', $text);  
    
    

    ..., aber wie kann ich z.B. wie in diesem Forum hier auch meinen Besuchern anbieten, auf andere Internetseiten zu verlinken, so dass die Besucher dann nur so etwas wie hier auch schreiben müssen:
    <http://de.selfhtml.org@....damit man's sehen kann>

    Weiß jetzt nicht auf Anhieb, aber im BBCode-Stil ist doch eher das [url]...[/url] üblich. Also so:

      
    $ergebnis = preg_replace('/\[url\]\s*(.+):(.+)\s*\[\/url\]/i', '<a href="$1&#58;$2">$1&#58;$2</a>', $text);  
    
    

    ... oder mit "sprechenden" Links:

      
    $ergebnis = preg_replace('/\[url\]\s*(.+):(.+)\s*\@(title|name)=(.+)\s*\[\/url\]/i', '<a href="$1&#58;$2">$4</a>', $text);  
    
    

    ... oder du wandelst einfach alles, was so ähnlich*) wie eine URL aussieht, in einen HTML-Link um:

      
    $ergebnis = preg_replace('/(http\:\/\/[^\s\>]+)(\s)/', '<a href="$1">$1</a>$2', $text);  
    
    

    *) Die Betonung liegt auf "so ähnlich", weil es für die Zeichen, die in einer URL stehen dürfen/können, genaue Festlegungen gibt. Für die meisten Fälle reicht aber der reguläre Ausdruck, den ich verwendet habe, aber aus.

    MffG
    EisFuX

    --
    Auch meine Hosenträger sind intelligent, in dem Sinne, dass man sie regulieren kann. Sie besitzen ein adaptives Verhalten.
    Stanisław Lem