2009-08-21 16 views
0

Wäre es möglich, ein wenig mehr "erweiterte" String ersetzen in einer MySQL-Abfrage? Ich lese über die REPLACE() Methode, aber soweit ich weiß, kann es nicht für ausgefallene Sachen verwendet werden.MySQL-Muster ersetzen

Grundsätzlich versuche ich, alle HTML-Tags aus einer bestimmten Spalte in einem großen Dataset zu entfernen. Dies in einer einzigen Abfrage zu tun wäre viel cooler, als PHP für die Verarbeitung dazwischen verwenden zu müssen. Kann ich etwas Elegantes tun, um alles zu entfernen, was in < > gekapselt ist?

ich gerade klar, dass es vor ihm ... aufgrund einiger unangebrachter Datenkonvertierungen ein weiterer kleiner Fang ist, jetzt < einige der Tags enthalten und>sich ... aussehen schlimmsten Fälle wie <(><<)>b>. Frag nicht einmal wie, aber etwas scheint furchtbar schief gelaufen zu sein. Wie auch immer, großartige Köpfe mit großartigen Ideen dazu?

+0

http://stackoverflow.com/questions/986826/how-to-do-a-regular-expression-replace-in-mysql || http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contented-tags?lq=1 –

Antwort

2

Kurze Antwort: Nein, das kann nicht in SQL gemacht werden. Dies ist die Art von Arbeit, die Sie in einer Programmiersprache tun müssten - jeder Programmiersprache, die Sie praktisch haben.

Da dies kein richtiges HTML ist, ist das Parsen mit herkömmlichen Methoden möglicherweise gar nicht möglich. Vielleicht helfen ein paar schreckliche hackische reguläre Ausdrücke, oder vielleicht werden Sie einen gewissen Abstand davon haben, bestimmte "fehlerhafte" Strings zu finden (z. B. wenn (><<)> häufig erscheint) und sie mit einem traditionellen REPLACE() zu löschen.

Die Details hängen natürlich von Ihren Daten und den verfügbaren Tools ab, aber MySQL wird nicht in der Lage sein, den Großteil dieser Arbeit zu leisten.

0

Sorry, du hast kein Glück. MySQL hat keine Regex- oder vergleichbare Ersatzfakultät.

1

Sie können eine Funktion hacken, aber ich denke nicht, dass das der richtige Weg ist.

CREATE FUNCTION strip_tags(String VARCHAR(9999)) 
RETURNS VARCHAR(9999) 
DETERMINISTIC 
BEGIN 
    DECLARE start, end, len INT; 
    SET start = LOCATE('<', String); 
    SET end = LOCATE('>', String, start); 
    WHILE start> 0 AND end > 0 DO 
     BEGIN 
     SET String = INSERT(String, start, end, ''); 
     SET start = LOCATE('<', String); 
     SET end = LOCATE('>', String, start); 
     END; 
    END WHILE; 
    RETURN String; 
END; 

Haftungsausschluss: Der Code wurde nicht getestet.

+0

Interessant ... aber ich denke, dass es mir mit dem Durcheinander nicht helfen wird -up-Tags Das Erstellen einer Funktion, die _will_ dies tut, ist wahrscheinlich keine beträchtliche Option. Danke trotzdem! – JorenB

+0

Sie können alles implementieren, was Sie wollen. Es ist nur eine Frage des Geschmacks. Für solch eine komplexe Logik wäre SQL nicht meine Wahl :) – Zed