Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] &a mp;a mp;a mp;a mp;q uot; B B

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] &a mp;a mp;a mp;a mp;q uot; B B

    hi,

    da oft gefragt wird, wie man BB-Code's realisieren kann,
    erkläre ich das hier mal mit den BB-Code's [b]Text[/b] und [url]http://phpfriend.de[/url]

    Den BB-Code [b]Text[/b] kann man mit preg_replace() "übersetzen":

    Code:
    $text = ("Ein fetter Text!");
    $text = preg_replace("|\[b\](.*)\[/b\]|Uism","$1",$text);
    Erklärung zum Pattern-Teil von preg_replace:
    [ und ] müssen jeweils mit einem Backslash \ markiert werden.
    (.*) ist ein Platzhalter für einen undefinierten Text (wie % bei MySQL-Abfragen).

    Die Pattern-Modifiers Uism:
    U: Durch den U-Modifier wird PHP nicht versuchen, soviele Chars einzufangen wie nur möglich bis es kein mögliches Ende des Patterns mehr findet.
    i: Es wird nicht zwischen GROSS- und klein-Buchstaben unterschieden
    s: Dadurch kann man bei (.*)-Wildcards auch mit \r\n usw. arbeiten
    m: Ohne m-Modifier würde es nur String-Anfang und -Ende geben. Diese werden über ^ bzw. $ angesprochen.
    Im MultiLine-Mode erkennt PHP NewLines und erweitert damt die Wirkung von ^ und $ ..


    Etwas schwieriger wird es, wenn man [URL]-Tags ersetzen will und dabei längere URL's gekürzt werden sollen,
    dafür wird preg_replace_callback(), create_function(), strlen() und substr() benötigt.

    preg_replace_callback() wird benötigt,
    weil die URL für den Link-Titel verändert werden soll,
    die Funktion ist ähnlich aufgebaut wie preg_replace().
    Code:
    $text = preg_replace_callback("||Uism","",$text);
    Die Pattern-Modifiers sind schon bekannt vom ersten Beispiel,
    neu ist hier, dass an zweiter Stelle eine Funktion benötigt wird,
    die hier einfachheitshalber mit create_function() erstellt wurde.
    Code:
    $text = preg_replace_callback("||Uism",create_function('$matches',''),$text);
    $matches ist ein Array,
    [0] ist der gesamte String des Callback's,
    ab [1] kommen dann die Zeichen in den Klammern,
    in diesem Fall ist also [1] http:// und [2] der unbekannte Text (.*).

    Mit strlen() prüfen wir, ob der String mehr als 30 Zeichen enthält,
    wenn dies der Fall ist, werden mit substr($matches[2],0,17) die ersten 17 Zeichen der URL ausgegeben und anschliessend mit substr($matches[2],-5) die letzten 5 Zeichen.

    Code:
    create_function(
    '$matches',
    'if (strlen($matches[2]) > 30) {
    return "<a href=\"http://".$matches[2]."\" target=_blank>http://".substr($matches[2],0,17)."[...]".substr($matches[2],-5)."</a>";
    }
    ')
    Wenn der String weniger als 30 Zeichen enthält wird die URL ungekürzt zurückgegeben, gesamter Code:

    Code:
    $text = ("Die phpfriend.de-Tutorials: http://phpfriend.de/forum/viewforum....r30zeichensind");
    
    $text = preg_replace_callback("|\[url\](http://)(.*)\[/url\]|Uism",create_function(
       '$matches',
       'if (strlen($matches[2]) > 30) {
          return "<a href=\"http://".$matches[2]."\" target=_blank>http://".substr($matches[2],0,17)."[...]".substr($matches[2],-5)."</a>";
        } else {
         return "<a href=\"http://".$matches[2]."\" target=_blank>http://".$matches[2]."</a>";
        }
    '),$text);
    Falls man [php]-Tags benutzen will,
    ist die Funktion highlight_string() hilfreich,
    highlight_string() kann dann in Kombination mit preg_replace_callback() angewendet werden..

    _______________________________
    Alle Angaben ohne Gewähr

  • #2
    Re: &quot;BB-Code&quot; realisieren

    Zitat von Tobias
    U: Dadurch wird verhindert, dass vom ersten [b] bis zum letzten [/b] ersetzt wird
    Ungreedy, heisst das Ding.
    Greedy = gierig
    Ohne U-Modifier wird PHP versuchen soviele Chars einzufangen wie nur möglich, bis es kein mögliches Ende des Patterns mehr findet.

    Zitat von Tobias
    s: Dadurch kann man auch mit \r\n usw. arbeiten
    Was sich aber ausschliesslich auf . auswirkt.
    Dieser Meta-Char ist eine Wildcard und passt auf alles. Ausser eben NewLines ... der s-Modifier ändert dies.

    Zitat von Tobias
    m: Durch diesen Modifier werden die Replacements auch auf mehrere Zeilen angewandt.
    Das ist nun aber mal völlig falsch! (bzw. falsch gesagt ^^)

    Es bezieht sich auf PHPs erkennung von Zeilen-Ende und -Anfang.
    Ohne m-Modifier gibt es nur String-Ende und -Anfang. Diese werden über ^ bzw. $ angesprochen.
    Im MultiLine-Mode erkennt PHP NewLines und erweitert damt die Wirkung von ^ und $ ..

    Kommentar


    • #3
      Re: &quot;BB-Code&quot; realisieren

      Zitat von Tobias
      Wenn der String weniger als 30 Zeichen enthält wird die URL ungekürzt zurückgegeben, gesamter Code:

      Code:
      $text = ("Die phpfriend.de-Tutorials: http://phpfriend.de/forum/viewforum....r30zeichensind");
      
      $text = preg_replace_callback("|\[url\](http://)(.*)\[/url\]|Uism",create_function('$matches','if (strlen($matches[2]) > 30) return "<a href=\"http://".$matches[2]."\" target=_blank>http://".substr($matches[2],0,17)."[...]".substr($matches[2],-5)."</a>";
      else return "<a href=\"http://".$matches[2]."\" target=_blank>http://".$matches[2]."</a>";'),$text);

      Callbacks sind eine feine Sache.
      create_function() ist auch ganz niedlich.
      Wenn man das ganze aber nicht mehr lesen kann, war es ein Griff ins Klo ^^

      Erst nach dem Auseinanderpflücken, konnte ich sehen, was du da eigentlich treibst.
      Und ich bin mir jetzt mal nicht so ganz sicher, ob $matches[2] der richtige Index ist ... 1 wäre mein Kandidat ...

      Code:
      <?php
      
      $text = preg_replace_callback('|\[url\](http://)(.*)\[/url\]|Uism', 'callBack_bbUrl', $text);
      
      function callBack_bbUrl($matches) {
          if (strlen($matches[2]) > 30) {
              return 'http://'.substr($matches[2],0,17).'[...]'.substr($matches[2],-5).''; 
          } else {
              return 'http://'.$matches[2].'';
          }
      }
      
      ?>

      Kommentar


      • #4
        hi,

        Hab mir schon fast gedacht, dass ich die Modifiers falsch hab
        werd das mal anpassen..

        Und ich bin mir jetzt mal nicht so ganz sicher, ob $matches[2] der richtige Index ist ... 1 wäre mein Kandidat ...
        [2] ist richtig,
        ich benutze das Script in ähnlicher Form u.a. bei Phoogle und es funktioniert:
        [0] ist der gesamte String, der zurückgegeben wird beim callback,
        und danach werden ja einfach die klammern einzeln hinzugefügt,
        und somit ist [1]= http:// ; [2]=.*

        Kommentar


        • #5
          *deng* .. 1. Klammer übersehen ^^

          Kommentar


          • #6
            Kennt ihr das???
            Da hat jemand mal eine Parserklasse für BBCode geschrieben:
            http://www.christian-seiler.de/projekte/php/bbcode/

            Kommentar


            • #7
              http://pear.php.net/package/HTML_BBCodeParser
              http://software.unclassified.de/cont...=code.php.abbc

              Diese beiden sind sogar erreichbar ...

              Kommentar


              • #8
                Meiner ist jetzt auch wieder on!!!

                Ich wollte noch zu dem Tutorial sagen das ich es ehrlich gesagt nicht ganz versteanden habe... du machst das zu ungenau.... Erkläre diese Befehle noch etwas besser... was soll diese variable $1 darstellen?

                Kommentar


                • #9
                  Re: &quot;BB-Code&quot; realisieren

                  Zitat von Tobias
                  Code:
                  $text = ("Ein fetter Text!");
                  $text = preg_replace("|\[b\](.*)\[/b\]|Uism","$1",$text);
                  Erklärung zum Pattern-Teil von preg_replace:
                  [ und ] müssen jeweils mit einem Backslash \ markiert werden.
                  (.*) ist ein Platzhalter für einen undefinierten Text (wie % bei MySQL-Abfragen).
                  Wie funzt das genau...Habe das in mein Code eingebunden, aber der Text wurde nich fett! Was genau hat es mit (.*) auf sich? Wie oder was kommt darein? $text wird doch schon übergeben?!

                  Kommentar


                  • #10
                    Re: &quot;BB-Code&quot; realisieren

                    Zitat von Lukas
                    Wie funzt das genau...Habe das in mein Code eingebunden, aber der Text wurde nich fett!
                    Nimm das:
                    http://test.php-help.info/bbcode-1/ (Quelltext wird angezeigt)

                    Tobias hatte die fetten HTML Tags vergessen.

                    Kommentar


                    • #11
                      Tolle Sache!!!
                      Vielen Dank dafür!
                      gleich mal testen...

                      EDIT
                      Die URL Geschichte funzt von ihm aber oder ist da auch nen Fehler drin?

                      Kommentar


                      • #12
                        Zitat von Lukas
                        Die URL Geschichte funzt von ihm aber oder ist da auch nen Fehler drin?
                        Einfach mal testen - testen kostet doch nix. Ich weiß nicht, ob Tobias die Korrekturen von Guradia eingearbeitet hat.

                        Kommentar


                        • #13
                          Alles klar...
                          Als Anregung:
                          Wie lassen sich Umlaute aus nem Text schnipseln und mit Html Befehlen wie diese ersetzten, damit sie von allen Browsern richtig erkannt werden:
                          &uuml;
                          &Uuml;
                          &auml;
                          usw...

                          Kommentar


                          • #14
                            Neue Frage:
                            Wie kann ich eigene Tags hinzufügen?
                            Ist es möglich font tags oder img tags einzubinden?
                            Wenn ja, warum gibt es dann diese Stelle?(das mittlere ist nicht in spitzen Klammern!)
                            Code:
                            ...("°\[([b|i|u])\](.*)\[/(\\1)\]°Uism","<$1>$2</$1>",$text);

                            Kommentar


                            • #15
                              Zitat von Lukas
                              Neue Frage:
                              Wie kann ich eigene Tags hinzufügen?
                              Ist es möglich font tags oder img tags einzubinden?
                              Wenn ja, warum gibt es dann diese Stelle?(das mittlere ist nicht in spitzen Klammern!)
                              Code:
                              ...("°\[([b|i|u])\] <- 1. Klammer: der öffnende Tag. b, i, u
                               (.*)  <- 2. Klammer: was zwischen öffnenden und schließenden Tag steht
                              \[/(\\1)\]° <- 3. Klammer: der schließende Tag. Hier steht das, was in der .1 Klammer gefunden wurde
                              Uism", <- Optionen
                              "<$1> <- Replace: die Zeichenmenge der 1. Klammer
                              $2 <- Replace: die Zeichenmenge der 2. Klammer
                              </$1>", <- Replace: die Zeichenmenge der 1. Klammer
                              $text);
                              Verstanden?

                              Du kannst das jetzt um BB-Codes erweitern, die keine Parameter beinhalten:
                              Code:
                              $text = preg_replace("°\[([b|i|u|h1|h2|h3|h4|h5|h6])\](.*)\[/(\\1)\]°Uism","<$1>$2</$1>",$text);
                              Oder Du nutzt Arrays:
                              Code:
                                  $pattern = array(   '{\[b\](.*)\[/b\]}smUi',
                                                      '{\[u\](.*)\[/u\]}smUi',
                                                      '{\[i\](.*)\[/i\]}smUi',
                                                      '{\[ul\](.*)\[/ul\]}smUi',
                                                      '{\[li\](.*)\[/li\]}smUi',
                                                      '{\[url=(.*)\](.*)\[/url\]}smUi',
                                                      '{\[url\](.*)\[/url\]}smUi',
                                                      '{\[surl=(.*)\](.*)\[/surl\]}smUi',
                                                      '{\[surl\](.*)\[/surl\]}smUi',
                                                      '{\[img\](.*)\[/img\]}smUi',
                                                      '{\[size=(.*)\](.*)\[/size\]}smUi',
                                                      '{\[color=(.*)\](.*)\[/color\]}smUi',
                                                      '{\[align=(.*)\](.*)\[/align\]}smUi',
                                                      '{\[\\\\\]}smUi',
                                                      '{\[center\](.*)\[/center\]}smUi',
                                                      '{\[(h[1-6]+)\](.*)\[/\\1\]}smUi',
                                                      '{\[email\](.*)\[/email\]}smUi',
                                                      '{\[fimg\](.*)\[/fimg\]}smUi',
                                                      '{\[fimg desc=(.*)\](.*)\[/fimg\]}smUi',
                                                      '{\[quote\](.*)\[/quote\]}smUi',
                                                      '{\[email\](.*)\[/email\]}smUi',
                              			'{\[h1\](.*)\[/h1\]}',
                              			'{\[h2\](.*)\[/h2\]}',
                              			'{\[h3\](.*)\[/h3\]}',
                              			'{\[h4\](.*)\[/h4\]}',
                              			'{\[h5\](.*)\[/h5\]}',
                              			'{\[h6\](.*)\[/h6\]}'
                                                      );
                                  
                                  $replace = array(   '\\1',
                                                      '<u>\\1</u>',
                                                      '\\1',
                                                      '<ul>\\1[/list]',
                                                      '[*]\\1',
                                                      '\\2',
                                                      '\\1',
                                                      '\\2',
                                                      '\\1',
                                                      '[img]\\1[/img]',
                                                      '<span style="font-size: \\1px;">\\2</span>',
                                                      '<span style="color: \\1;">\\2</span>',
                                                      '<div align="\\1">\\2</div>',
                                                      '\\\\'.'\n',
                                                      '<div align="center">\\1</div>',
                                                      '<\\1>\\2</\\1>',
                                                      '\\1',
                                                      '[img]./images/\\1[/img]',
                                                      '[img]./images/\\2[/img]',
                                                      '<table width="90%" border="0" cellspacing="2" cellpadding="2" align="center" style="border: 1px dashed black;"><tr><td>Quote:
                              \\1</td></tr></table>',
                                                      '\\1',
                              			'<h1>\\1</h1>',
                              			'<h2>\\1</h2>',
                              			'<h3>\\1</h3>',
                              			'<h4>\\1</h4>',
                              			'<h5>\\1</h5>',
                              			'<h6>\\1</h6>'
                                                      );
                                  
                                  $text = preg_replace($pattern,$replace,$text);
                                  $ret = str_replace('http://http://','http://',$ret); # Korrektur, falls der Link schon mit http(s) angegeben wurde
                                  $ret = str_replace('https://https://','http://',$ret); #
                              Wenn Du CODE und PHP BB-Tags verwenden willst, dann geht das zB. so:
                              Code:
                              # Es folgen ein paar verwendete Funktionen:
                              Funktion zum Entfernen von 
                               in Abschnitten zwischen <pre>
                              function pre_core ($text)
                              {
                              	$text = preg_replace("=<br(>|([\s/][^>]*)>)\r?\n?=i", "\n", $text[1]);
                                  return $text;
                              }
                              
                              # Funktion zum Entfernen von HTML-Tags bis auf [b], [i], <u>, und <a>
                              function safeHTML($html)
                              {
                              	$html = stripslashes($html);
                              	$html = strip_tags($html, "[b][i]<u><a>");
                              	return $html;
                              }
                              
                              # Funktion wandelt HTML Entities zurück | @@ Thorsten, 2003-03-27
                              function unhtmlentities($html)
                              {
                              	$translation_table = get_html_translation_table (HTML_ENTITIES);
                              	$translation_table = array_flip ($translation_table);
                              	$content = strtr ($html, $translation_table);
                              	return preg_replace('/\&\#([0-9]+)\;/me', "chr('\\1')", $content);
                              }
                              
                              # Funktion für PHP-Syntax-Highlighting
                              function php_syntax($output)
                              {
                                  $ret = $output[1];
                                  $ret = wordwrap($ret, 120, "\n", 0);
                                  $ret = highlight_syntax(unhtmlentities($ret));
                                  return "<pre>".$ret."</pre>";
                              }
                              
                              # Funktion für PHP-Syntax-Highlighting
                              function highlight_syntax($code)
                              {
                                  return ob_highlight_syntax ($code);
                              }
                              
                              # Funktion für BB-Code
                              function code_core ($text)
                              {
                                  $text = preg_replace("=<br(>|([\s/][^>]*)>)\r?\n?=i", "\n", $text[1]);
                                  return $text;
                              }
                              
                              # Funktion für BB-Code
                              function code_syntax($output)
                              {
                                  $ret = $output[1];
                                  $ret = wordwrap($ret, 120, "\n", 0);
                                  $ret = unhtmlentities($ret);
                                  return "<pre>".$ret."</pre>";
                              }
                              
                              # Funktion für BB-Code
                              function ob_highlight_syntax ($code)
                              {
                                  ob_start();
                                  @highlight_string($code);
                                  $code = ob_get_contents();
                                  ob_end_clean();
                                  return $code;
                              }
                              
                                  $text = preg_replace_callback("#\[php\](.*)\[\/php\]#Usi","php_syntax", $text);
                                  $text = preg_replace_callback("#\[code\](.*)\[\/code\]#Usi","code_syntax", $text);
                              So oder so ähnlich.

                              Die Funktionen waren ursprünglich für eine Zeilennummerierung bei der Codeansicht gedacht (das wurde oben weggelassen) und können selbstverständlich auch vereinfacht werden.

                              Kommentar

                              Lädt...
                              X