MySQL update mit regexp?
-
Aloha.
Ich habe folgendes "Problem":
Es geht um eine Forendaten. Dieses Forum unterstützt natürlich BB-Codes.Nun existiert ein Code für Spoiler (also text, der erst auf knopfdruck angezeigt wird) [spoiler=xxxx]asdasd[/spoiler], wobei das xxxx für die id des textblocks steht, der aus/eingeblendet werden soll. Dementsprechend muss das ein (pro threadseite) eindeutiger Schlüssel sein.
Da man aber natürlich nicht jedesmal alle "in der Nähe befinelichen" Spoiler absuchen will, hab ich nun eine Variante ohne eindeutigen Schlüssel gesucht/gefunden.
Der BBCode dafür ist nun [spoil]asdasd[/spoil].Nun würde ich gerne alle posts, mit den alten spoilern abändern, sodass nur noch das neue spoil-tag benutzt wird.
Das ganze kann man zwar mit den Stringfunktionen mache ("[spoiler=" suchen, von der position aus das nächste "]" suchen und das alles durch "[spoil" ersetzen, anschliessend "[/spoiler]" durch "[/spoil]" ersetzen), aber das finde ich doch arg umständlich.
Nun kann man ja mit Regexp diese stellen rausfinden und auch gleich ersetzen lassen (zumindest kann man soetwas mit dem "guten alten" sed).
Nun meine Frage:
Kann man solche regexp (also welche, die nicht nur suchen, sondern auch ersetzen) mit mysql direkt mit mysql benutzen?Oder gibt es vielleicht noch andere - vielleicht sogar noch einfachere? - lösungen dafür?
Vielen dank schonmal alleine für das durchlesen..
-
Schade
-
Ehrlich gesagt halte ich das designtechnisch für bedenklich.
Wozu braucht ein Spoiler eine Spoiler-ID? Wenn das Text ist, den User selbst eingeben können, würde ich einfach
[spoiler]Blablablubb[/spoiler]
oä. verwenden.Deine Applikation kann dann auf die entsprechende Textstelle per Javascript eine CSS-Klasse anwenden, um den Text anzuzeigen und wieder auszublenden.
Die User direkt eine Spoiler-ID angeben zu lassen, wäre in meinen Augen sehr hässlich; damit lässt Du ziemlich viele Implementierungsdetails nach außen.
-
Da hast du recht. Und weil das bedenktlich und "dämlich" ist, soll es ja auch weg.
ich will ja das komische [spoiler=xxxx] gegen [spoil] tauschen.
-
Oh, Sorry. Verstehe ich richtig, dass Du einfach in der ganzen DB [spoiler=1234] durch [spoiler] ersetzen möchtest?
Wenn ja: Das sauber per MySQL zu machen halte ich für unmöglich bis äußerst unbequem. Schreib Dir einfach einen Python-Fünfzeiler oder so, der sich darum kümmert.
Einfach mal innerhalb eines Wartungsfensters ein LOCK TABLE blubb; am Anfang und dann über alle Beiträge drüberiterieren, die einen Spoiler enthalten.
-
Das kann MySQL meines Wissens nicht. REGEXP funktioniert nur für Abfragen, nicht für Ersetzungen.
Oder was auch ginge:
Datenbank sperren
Export der Tabelle in Datei
mit einem Tool durch die Ascii-Datei fahren
alte Tabelle umbenennen
Import in Tabelle aus geänderter DateiMySQL
@nman: Design - das phpBB macht das für seine Codes auch so.
-
Marc++us schrieb:
@nman: Design - das phpBB macht das für seine Codes auch so.
Das ist ein ziemlich guter Benchmark für richtig schlechtes Design, den man auch Laien gut nahebringen könnte: “Macht PhpBB das nicht auch so?” “Ja, Chef, aber…” “Sie sind gefeuert. Räumen Sie ihren Schreibtisch bis 11.”
-
Hm. Das habe ich fast befürchtet. Nagut, dann wird uns wohl nix anderes übrig bleiben, als es ausserhalb der datenbank zu lösen.
Wenigstens kann ich die entsprechenden einträge per regexp suchen. Das erleichtert die Sache doch enorm.
Trotzdem vielen Dank fürs Gedanken machen!