Mehrfaches Ersetzen im Query

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mehrfaches Ersetzen im Query

    Hallo,

    es sollen in einer Datenbankabfrage bestimmte Zeichen (BB-Tags) ersetzt werden. Dazu habe ich die REPLACE-Funktion in der Beschreibung zu MySQL gefunden.

    Jedoch weiß ich nicht, wie ich mit dieser Funktion eine ganze Reihe von Zeichenfolgen ersetzen kann (halt die ganze BB-Palette).

    Zum Ersetzen von BB-Tags habe ich irgendwo diesen PHP-Ausdruck gefunden:
    PHP-Code:
    $content preg_replace('/\[.+\]/U'''$content); 
    Der Querystring sieht wie folgt aus:
    PHP-Code:
    $query =  "SELECT t.topic AS title,"
            
    "\n p.message AS text,"
            
    "\n p.posttime AS created,"
            
    "\n CONCAT_WS('/',  'Forum', b.title) AS section,"
            
    "\n CONCAT('forum/thread.php?threadid=', p.threadid) AS href,"
            
    "\n $window AS browsernav" 
            
    "\n FROM #__posts AS p"
            
    "\n LEFT JOIN #__threads AS t ON t.threadid=p.threadid"
            
    "\n LEFT JOIN #__boards AS b ON b.boardid=t.boardid"
            
    "\n $compare"
            
    "\n ORDER BY $order"
    Um einen einzelnen BB-Tag zu ersetzen, funktioniert das mit:
    PHP-Code:
    $query =  "SELECT t.topic AS title,"
            
    "\n REPLACE(p.message, '[B]','') AS text,"
            
    "\n p.posttime AS created,"
            
    "\n CONCAT_WS('/',  'Forum', b.title) AS section,"
            
    "\n CONCAT('forum/thread.php?threadid=', p.threadid) AS href,"
            
    "\n $window AS browsernav" 
            
    "\n FROM #__posts AS p"
            
    "\n LEFT JOIN #__threads AS t ON t.threadid=p.threadid"
            
    "\n LEFT JOIN #__boards AS b ON b.boardid=t.boardid"
            
    "\n $compare"
            
    "\n ORDER BY $order"
    Jetzt bräuchte ich die REPLACE-Funktion in Kombination mit dem PHP-Ausdruck zum Ersetzen aller Tags.

    Kann mir jemand sagen, wie das aussehen muss?

    Wäre für Hilfe sehr dankbar!

    Gruß
    Peter

  • #2
    MySQL kennt auch RegEx http://www.mysql.org/doc/refman/4.1/en/regexp.html kombiniere richtig, dann könntest du ohne PHP auskommen.

    Kommentar


    • #3
      Re: Mehrfaches Ersetzen im Query

      http://dev.mysql.com/doc/refman/5.0/en/regexp.html

      Kommentar


      • #4
        Erstmal vielen Dank euch beiden für eure prompten Antworten.

        Ich habe irgendwie eine Allergie auf reguläre Ausdrücke und bin mit SQL auch nicht sehr bewandert.

        Kann mir jemand sagen, wie und wo ich das in den query einbauen muss?

        Gruß
        Peter

        Kommentar


        • #5
          Anstelle von "[B]", denn du möchtest ja nicht nur diesen einen String ersetzen sondern alle, die auf einen regulären Ausdruck matchen.

          Kommentar


          • #6
            Original geschrieben von Marchert
            Kann mir jemand sagen, wie und wo ich das in den query einbauen muss?
            Am besten gar nicht.
            Sowas SQL-seitig lösen zu wollen, halte ich für extrem umständlich und unperformant.

            Wenn du mit RegEx nicht so bewandert bist - dann erfinde halt das Rad nicht neu, sondern nutze fertige Lösungen; bspw. diese exzellente BBCode-Parserklasse.
            (Die hat auch noch den Vorteil, dass sie eben ein richtiger Parser ist, und nicht bloss stumpfes Suchen-Ersetzen durchführt, mit dem man etwas komplexere Verschachtelungsregeln gar nicht mehr vernünftig abbilden kann.)
            I don't believe in rebirth. Actually, I never did in my whole lives.

            Kommentar


            • #7
              Hmm, klappt irgendwie nicht so recht:
              PHP-Code:
              $query =  "SELECT t.topic AS title,"
                      
              "\n REPLACE(p.message, REGEXP '/\[.+\]/U','') AS text,"
                      
              "\n p.posttime AS created,"
                      
              "\n CONCAT_WS('/',  'Forum', b.title) AS section,"
                      
              "\n CONCAT('forum/thread.php?threadid=', p.threadid) AS href,"
                      
              "\n $window AS browsernav" 
                      
              "\n FROM #__posts AS p"
                      
              "\n LEFT JOIN #__threads AS t ON t.threadid=p.threadid"
                      
              "\n LEFT JOIN #__boards AS b ON b.boardid=t.boardid"
                      
              "\n $compare"
                      
              "\n ORDER BY $order"
              Damit bekomme ich kein Suchergebnis mehr. Wäre für weitere Hilfe sehr zu Dank verpflichtet.

              @wahsaga:
              Das ist bestimmt die professionellste Lösung, nur als Anfänger bräuchte ich relativ lange, bis das läuft.

              Den Nachteil bei Verschachtelungen kann ich in Kauf nehmen, da es sich nur um ein Suchskript handelt, das gerade mal die ersten 2 Zeilen vom Post zurückgibt.

              Gruß
              Peter

              Kommentar


              • #8
                die / als Begrenzer brauchst du nicht und ich bezweifle sogar dass U-Modifier verstanden wird

                Kommentar


                • #9
                  ...und ich bezweifle sogar dass U-Modifier verstanden wird
                  Ich bezweifle alles, da ich keine Ahnung von regulären Ausdrücken habe

                  Also damit wird`s leider auch nichts:
                  PHP-Code:
                  "\n REPLACE(p.message, REGEXP '\[.+\]','') AS text," 
                  Noch jemand eine Idee?

                  Gruß
                  Peter

                  Kommentar


                  • #10
                    Hmm, das mit dem REGEXP im Querystring funktioniert nicht, da nur 0 oder 1 zurückgegeben wird (so habe ich es jedenfalls verstanden).

                    Kann mir jemand helfen, wo ich "preg_replace" anwenden muss, um die Ersetzung zu bekommen?

                    Ich habe folgenden Code für die Datenbankabfrage:
                    PHP-Code:
                    $query =  "SELECT t.topic AS title,"
                            
                    "\n p.message AS text,"
                            
                    "\n p.posttime AS created,"
                            
                    "\n CONCAT_WS('/',  '$title', b.title) AS section,"
                            
                    "\n CONCAT('forum/thread.php?threadid=', p.threadid) AS href,"
                            
                    "\n $window AS browsernav"
                            
                    "\n FROM " $prefix "posts AS p" 
                            
                    "\n LEFT JOIN " $prefix "threads AS t ON t.threadid=p.threadid"
                            
                    "\n LEFT JOIN " $prefix "boards AS b ON b.boardid=t.boardid"
                            
                    "\n $where"
                            
                    "\n ORDER BY $order";
                                
                    $searchDB->setQuery($query0$limit);

                    return 
                    $searchDB->loadObjectList(); 
                    Ersetzt werden sollen die BB-Tags in der p.message-Tabelle. Hier noch einmal den Ausdruck, den ich dazu gefunden habe:
                    PHP-Code:
                    $content preg_replace('/\[.+\]/U'''$content); 
                    Wäre für Hilfe sehr dankbar!

                    Gruß
                    Peter

                    Kommentar


                    • #11
                      Hallo nochmal,

                      bräuchte immer noch Hilfe.

                      Ich würde notfalls auch die StringParser_BBCode-Klasse einbauen, wenn mir jemand sagt, wie und wo ich diese mit der Datenbankabfrage verknüpfen kann

                      Danke und Gruß
                      Peter

                      Kommentar


                      • #12
                        Was gibt es das zu "verknüpfen"?

                        Du übergibst ihr einen Text, in dem BBCodes geparst werden sollen.
                        Ob du den vorher aus einer DB geholt, oder von der Strasse gekratzt hast, interessiert doch nicht.
                        I don't believe in rebirth. Actually, I never did in my whole lives.

                        Kommentar


                        • #13
                          Gut, ich gebe es hier auf.

                          Normalerweise verstehe ich unter einem Forum einen Anlaufort, wo jemandem GEHOLFEN wird, auch wenn er keine oder wenig Ahnung hat.

                          Ist es denn zuviel verlangt 1 Zeile code zu posten?

                          Gruß
                          Peter

                          Kommentar


                          • #14
                            Original geschrieben von Marchert
                            Normalerweise verstehe ich unter einem Forum einen Anlaufort, wo jemandem GEHOLFEN wird, auch wenn er keine oder wenig Ahnung hat.
                            Das wird hier auch tagtäglich erneut versucht.

                            Wenn aber immer wieder Leute kommen, die auf Vorschläge nicht eingehen wollen, und stattdessen mit "gib mir doch einfach fertigen Code" kommen - was die Mehrheit hier als pure Schnorrerei betrachten dürfte - dann ist manchmal einfach "nicht zu Helfen".
                            Ist es denn zuviel verlangt 1 Zeile code zu posten?
                            Es scheint offenbar von dir zu viel verlangt zu sein, einzusehen bzw. zu erkennen, dass solch eine BBCode-Implementierung ein relativ komplexes Problem darstellt, dass sich nicht mit "einer Zeile Code" lösen lässt.

                            Ein wenig Ahnung musst du schon mitbringen oder dir zumindest aneignen, wenn du nicht-triviale Probleme lösen willst.
                            Wenn du das nicht willst - dann steht es dir frei, das jemanden für dich erledigen zu lassen, gegen Bezahlung, oder auf die Umsetzung zu verzichten.
                            I don't believe in rebirth. Actually, I never did in my whole lives.

                            Kommentar


                            • #15
                              Original geschrieben von wahsaga ..., dass solch eine BBCode-Implementierung ein relativ komplexes Problem darstellt, dass sich nicht mit "einer Zeile Code" lösen lässt.
                              Hmm, dann muss ich mich fragen, warum man mir das nicht gleich sagt. Dann hätten wir uns viel Zeit sparen können.

                              Gruß
                              Peter

                              Kommentar

                              Lädt...
                              X