preg_match_all und BBcodes

  • preg_match_all und BBcodes

    Hallo,

    ich Integrierte gerade Geshi in mein Forum. Dabei werden die BBCodes in der DB abgelegt.

    Die BBCodes funktionieren soweit. Habe ich allerdings 2 oder mehr gleiche BBCodes in einem Post wird der erste nicht Geschlossen und er erkennt

    PHP-Quellcode

    1. echo

    Ein Text

    PHP-Quellcode

    1. echo


    als ein einzigen BBcode.
    Das Problem ist, dass preg_match / preg_replace, was con seitens des Forums schon ausgeführt wird und NICHT verändert werden darf immer ein Gesamtvorkommen erkennt. Also nicht nacheinander.

    Soweit ich weiss muss ich innerhalb der Funktion mit preg_match_all und count arbeiten.
    Ich Versuche das nun einige Tage, leider ohne erfolg. Hat da jemand etwas ähnliches und würde mir seinen Code Posten?

    $source ist der Post Text und $language enthällt zb. php oder mysql oder css

    Quellcode

    1. function bbcode_callback($source, $language) {
    2. $source = str_replace('\"', '"', $source);
    3. $source = str_replace(">", ">", $source);
    4. $source = str_replace("&lt;", "<", $source);
    5. $source = str_replace("&amp;", "&", $source);
    6. $source = str_replace("'", "'", $source);
    7. $source = str_replace("&quot;", "\"", $source);
    8. $source = str_replace('\\"', '"', $source);
    9. $geshi = new GeSHi($source, $language);
    10. $geshi->enable_keyword_links(true);
    11. $source = $geshi->parse_code();
    12. return '<div class="codebox"><div class="codebox_title">'.$language.'</div><div class="codebox_content">'.$source.'</div></div>';
    13. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von GXH ()

  • Was mir mal empfohlen wurde:
    OOP.
    Wie genau das aussieht, kann ich mir nur in etwa so vorstellen:

    Es wird nach Inhalten gesucht, welche zwischen [ und ] stehen. In einer Datenbank wird dann gesucht, ob es diesen Inhalt - also den BB-Code - gibt. Wenn ja, wird geschaut, ob irgendwo der BB-Tag geschlossen wird (also es wird in einem Array gespeichert, welche Tags geöffnet werden). Bleibt ein Tag übrigens, also wird er nur geöffnet, aber nicht geschlossen, so wird er als ganz normaler Text angezeigt.

    Ist jetzt das einzigste, was mir dazu einfällt, wenns drum geht, die zu verschachteln.
  • Ok, ich bin am Ende: Meine Funktionen-, Code- und Synaxkenntnisse reichen nicht aus, dass ich jetzt da was auf die Reihe kriegen würde.

    Im Kopf hätte ich aber einen Plan, wie das ganze arbeiten soll.. vielleicht kann ja jemand von euch was nützliches draus machen:

    Der Text, in welchem der BB-Code sich befindet, wird einer Funktion übergeben. Diese überprüft die kompletten übergebenen Daten, ob in dem Inhalt etwas in [ und ] übergeben wurde. Wenn ja, so wird davon der Inhalt ausgelesen. Dieser Inhalt wird dann durch eine Datenbank (deren Aufbau weiter unten) gejagt und geschaut, ob es diesen BB-Code gibt. Gibt es diesen, so wird aus der Datenbank ebenfalls der Schließtag (sofern einer eingetragen ist) aus den übergebenen Daten gesucht. Ist auch der Schließtag vorhanden, so werden der BB-Codeöffnungs- und Schließungstag mit den in der Datenbank hinterlegten HTMLöffnungs- und Schließungstags ersetzt.
    Wird der Schließungstag in der Datenbank nicht gefunden - oder der Inhalt in der geschlossenen Klammer - so wird an dieser Stelle an den Daten nichts geändert.

    Alternativ könnte auch auch der Öffnungs- und Schließungstag einzelnd eingetragen werden, allerdings besteht dann die Gefahr, dass der Schließungstag fehlt und damit die komplette Webseite verändert - vom Design.

    Ich hoffe, es kann damit vllt. jemand etwas nützliches anfangen.

    LG

    Fipsi
  • Genau so sollte das mit preg_match_all lösbar sein.

    Gabe versucht den Code unten auf meine Funktion anzuwenden ohne klasse, leider ohne erfolg


    Quellcode

    1. /**
    2. * method to search a given string for all code text enclosed in the given code tags
    3. * and replace them with code ran through geshi
    4. * @param string $source
    5. * @param string $tag
    6. * @param string $language
    7. *
    8. */
    9. public static function codeToGeshi($source = false, $startTag = "<YOURTAG>", $endTag = "</YOURTAG>", $language = "php") {
    10. $startPos = 0;
    11. while ( $startPos = strpos ( $source, $startTag, $startPos ) ) { // find the pos of the first tag // loop untill we do not find any more start tags
    12. // use the pos of first tag to start search for end tag
    13. $endPos = strpos ( $source, $endTag, $startPos );
    14. $source = substr_replace ( $source, self::doGeshi ( substr ( $source, $startPos + strlen ( $startTag ), $endPos - $startPos - strlen ( $startTag ) ), $language ), $startPos + strlen ( $startTag ), $endPos - $startPos - strlen ( $startTag ) );
    15. $startPos = strpos ( $source, $endTag, $startPos );
    16. }
    17. return $source;
    18. }
    19. public static function doGeshi($source, $language) {
    20. $geshi = new GeSHi ( $source, $language );
    21. return $geshi->parse_code ();
    22. }
    Alles anzeigen