Announcement

Collapse
No announcement yet.

löschen von Tags mit einem Trigger

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • löschen von Tags mit einem Trigger

    Hallo !

    ich habe eine Tabelle

    ---------
    id | text |
    ---------
    | |
    ---------

    In dieser Tabelle werden Texte eingefügt. Dummerweise werden Texte eingefügt die mit
    Word erstellt wurden. :-(
    Ich möchte einen Trigger erstellen der auf 'insert' reagiert und mit einem
    regulären Ausdruck alle Tags in der Spalte 'text' entfernt.

    Hier ein fehlgeschlagener Versuch:

    Code:
    DELIMITER $$
    
    CREATE
        TRIGGER `meineDatenbank`.`meinTrigger` BEFORE INSERT
        ON `meineDatenbank`.`meineTabelle`
        FOR EACH ROW BEGIN
        
    	IF REGEXP NEW.text ('<[a-zA-Z0-9-_\/]>') THEN
    	   SET NEW.txt = REPLACE(NEW.txt'<[a-zA-Z0-9-_\/]+>','');
    	END IF 
    
        END$$
    
    DELIMITER ;
    Wer kann mit einer Idee weiterhelfen ?

    Mit freundlichen Grüßen

    Stephan

  • #2
    Originally posted by Stephan123 View Post
    Hier ein fehlgeschlagener Versuch:
    Woran erkennst du, dass der Versuch fehlgeschlagen ist? Wie sieht ein einzelner Text aus, der behandelt werden soll? Außerdem wechselst du zwischen 'text' und 'txt' (aber das sind vermutlich/hoffentlich nur Schreibfehler).

    Die MySQL-Referenz verstehe ich so, dass die Syntax wie folgt zu verwenden ist (auch wenn mir das für einen SQL-Befehl seltsam vorkommt):
    [HIGHLIGHT=sql]IF (NEW.text REGEXP '<[a-zA-Z0-9-_\/]>') THEN [/HIGHLIGHT]
    Jürgen

    Comment


    • #3
      Hallo !

      Du hast Recht, der Wert muss 'text' heissen.
      Ich habe ein weiteres Experiment durchgeführt.

      Ich gebe in die Spalte 'text' folgenden Text ein:
      "<b>Nach mehreren Jahren Umbau</b>"

      In den Trigger habe ich folgende IF - Abfrage eingefügt.

      IF (NEW.text REGEXP '<[a-zA-Z0-9-_\/]+>') THEN
      NEW.text = '1234';
      END IF;

      Nach dem erneuern des Triggers bekomme ich die Fehlermeldung:
      Error Code:

      1064 You have an error in your SQL syntax; check the manual that corresponds
      to your MySQL server version for the right syntax to use near '.text = '1234';

      Mit freundlichen Grüßen Stephan

      Comment


      • #4
        Jetzt fehlt (anders als im ersten Versuch) SET. Jürgen

        Comment


        • #5
          Hallo !

          Du hast Recht.
          Es fehlte 'SET'.

          Jetzt ist irgendetwas mit der REGEXP:

          Der Fehler lautet:
          Got error 'invalid character range' from regexp

          Also auf zum nächsten Test.

          Gruß Stephan

          Comment


          • #6
            Ich habe bei RegEx nur minimale Kenntnisse. Meine Vermutung geht dahin: Der Bindestrich hinter '0' wird als Definition eines Bereichs missverstanden. Wenn du nach dem Bindestrich suchen willst, musst du ihn möglicherweise "maskieren":
            [HIGHLIGHT=sql]IF (NEW.text REGEXP '<[a-zA-Z0-9\-_\/]>') THEN[/HIGHLIGHT]
            Jürgen

            Comment


            • #7
              Hallo !

              Wenn ich das richtig gelesen habe, dann ist der angedachte Lösungsweg in MySQL nicht möglich.
              Diese Variante funktioniert.

              SET NEW.txt = REPLACE (NEW.txt,"<b>", "");

              Leider kann in 'Replace' kein RegEx verwendet werden.
              Lösungsvorschläge die ich gesehen habe gehen dahin, das eine function in Mysql geschrieben wird.
              In dieser Funktion wird der Inhalt einer Spalte Zeichenweise zerlegt, nach bestimmten Anfangs und Endzeichen
              gesucht und der Inhalt neu zusammengeschraubt und zurück gegeben.

              Das kann doch nicht wahr sein !!!

              Gruß Stephan

              Comment


              • #8
                Hallo,
                Originally posted by Jürgen Thomas View Post
                ...Die MySQL-Referenz verstehe ich so, dass die Syntax wie folgt zu verwenden ist (auch wenn mir das für einen SQL-Befehl seltsam vorkommt):
                Wieso seltsam? REGEXP (Synonym RLIKE) wird synonym zu LIKE verwendet und hat damit dieselbe Syntaxvorlage.

                Originally posted by Stephan123 View Post
                ...Leider kann in 'Replace' kein RegEx verwendet werden....
                Naja, wie schon gesagt wird REGEXP in MySQL lediglich als "Erweiterung" zu LIKE verstanden und liefert genau wie dieses nur den logischen Treffer. Komplexe RegEx-Operationen sind mit MySQL nicht möglich. Und hier fängt sicher die Streiterei an, ob komplexe Vorgänge wie Stringersetzungen anhand von Regulären Ausdrücken nicht doch Sache der Applikation und nicht der Datenbank sind.
                Ausserdem sind Ersetzungen von Tags nicht unbedingt gut mit regulären Ausdrücken zu lösen. Dein Ausdruck würde aus dem Text.
                HTML Code:
                <h1>Das ist die Headline</h1>
                <p>Und das der Text</p>
                einfach einen Leerstring machen, weil er alles zwischen dem Ersten < und dem Letzten > weghaut. Hier ist also in jedem Fall noch die Gier von Quantifikatoren zu berücksichtigen und da wird es selbst in Sprachen, die eine gute RegEx-Unterstützung haben, aufwändig.

                Gruß Falk
                Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                Comment

                Working...
                X