Inhalte aus Datenbank entfernen mit REGEXP_REPLACE

  • Kleiner Guide, wie man sich die Arbeit erleichtern kann, nach diversen CMS-Wechsel, wenn alte Einträge komplett an Gültigkeit verlieren und so z.B. interne Verlinkungen erzeugen, die ins Nichts führen.

    In diesem Fall geht es um die Möglichkeit, mit REGEXP_REPLACE bestimmte Abschnitte durch etwas Anderes zu ersetzen.


    Beispiel, in der Datenbank in den Tabellenfeldern mit CMS-Content wurden Bilder über folgenden Code geladen: <image data="12345678"></image>

    Den jeweiligen eigenen zu entfernende Abschnitt gilt es natürlich selbst zu identifizieren.

    Code
     UPDATE TABELLE SET FELD = REGEXP_REPLACE(FELD, '<image data="([a-zA-Z0-9=]+)"></image>', '') WHERE FELD LIKE '%image%';

    Als "TABELLE" muss der eigene Tabellenname benutzt werden, hier "Post-Section".

    Als Feld der Name des Tabellenfeldes, in meinem Fall "CMS-Content"

    Bevor man diesen Befehl ausführt, Backup der Datenbank machen und anschließend in PHPMyAdmin ausführen. Der Image-Part wird entfernt und durch ein "" (nichts) ersetzt.

    2 Mal editiert, zuletzt von Frank-L (2. November 2023 um 12:16)

  • Mit regex ein update ueber die ganze tabelle fahren ist eher was fuer leute, die gerne gefaehrlich leben :)

    Normalerweise mache ich es immer so das ich die rohdaten bei erstellung grosser datenmengen/texte aufhebe, und dann noch eine "konvertierte" version fuer das CMS habe. im einfachsten fall eben einenfach nur eine zweite spalte in der datenbank. Damit bleibt das original erhalten, und es geht spaeter nichts verlorenen oder kaputt wenn irgendwas umformatiert werden muss.

  • Mit regex ein update ueber die ganze tabelle fahren ist eher was fuer leute, die gerne gefaehrlich leben

    Warum? Wenn man die Tabelle vorher kopiert, einfach nur als neue Tabelle mit neuem Namen speichert, da braucht es noch nicht mal ein Backup, oder eben nur die Spalte kopiert und als Sicherung führt, dann dauert eine Wiederherstellung im Fehlerfall weniger als 30 Sekunden.

    So mit den Rohdaten mache ich das selbst eigentlich auch, z.B. im Kalendersystem mit User CSS. Da ist auch alles Roh gespeichert, damit man das dann umwandeln kann wie man will und final als fertiges CSS in der Datenbank steht. Aber es geht an vielen Stellen schlicht nicht, da nicht vorhanden. Selbst die ganzen Posts hier im Forum gibt es nicht als Rohdaten. Sieht man sehr gut an den alten Posts, die schon 3 oder 4 Systemwechsel hinter sich haben und endlich Dinge nicht mehr funktionieren, weil die das System bei der Speicherung hinzugefügt hat. Das geht so weit, dass selbst Dinge wie Fettschriften mal als BB-Code drinnen stehen, mal als HTML. Absätze als HTML oder eben als \n\r etc. Bilder, als Bild-URL, aber auch als interner Code, der dann im Editor wieder als BB-Code kommt. Da gibt es also für das identische Bild drei Angaben. Bearbeiten kann man aber nur das, was in der Datenbank vorhanden ist und auch überhaupt dort ankommt.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Ging mir eher um das regex.

    Was mir oefters passiert ist das regex bei den strings funktioniert die ich getestetet habe, aber dann sind am ende 5% der daten falsch oder vergessen worden, weil ich oder die regex uebersehen hat das manche strings unsauber sind und irgendwo noch leerzeichen, zeilenumbruch oder sonderzeichen dazwischen waren und uebersehen wurden. Besonders schlecht, wenn man 9k eintraege hat und der fehler erst irgendwo nach den ersten 1000 datensaetzen auftritt, die man beim ueberfliegen der ergebnisse nicht sieht...

  • Da haste recht, das kann vorkommen, kenne ich zugute. Wobei das eher der Fall ist, dass da zu wenig ersetzt wird als zu viel. Wenn ich das oben richtig deute, dann kann das auch nur sehr bestimmte Dinge ersetzen. Wenn da irgendwas anders ist, dann bleibt es halt wie es war. Nochmal einen normale Suche drüber laufen lassen, ob der "Suchbegriff" weg ist sollte da reichen. Wenn nicht weg, dann hat der halt ein anderes Muster.

    Aber ja, falsch oder fehlerhaft ersetzen, das hatte ich vor den Rohdaten mit dem CSS-Zeug. Das waren fertige Files, die dann mal in die DB kamen - an die 72.000 Stück. Und dann, jahre später, sollte umgestellt werden auf CSS3 mit Gradient etc.... Da sagte ich auch Danke.... Fertige Files, mal mit Leerzeichen nach dem : mal ohne, mal mit ; an der letzten Anweisung, mal ohne etc. Mal alles in einer Zeile, mal eine Zeile für Wert. Oder Daten, die der Kunde eingetragen hat im Sinne von "border-width: dicker" oder "color: dunkles rot". Oder trivial, aber korrekt, Farben als Hex mit 6 oder 8 Stellen, als rgb, rgba etc.

    Da konnte man regex auch vergessen, zumindest in der DB. Das ging dann alles Stück für Stück in PHP ins JSON, dann alles bereinigen, was ohnehin falsch ist, neu sortieren, dass das alles die gleiche Reihenfolge hat und dann die einzelnen Werte und Klassennamen per regex holen. Fertiges JSON bilden und zurück in die DB als "Rohdaten". Daraus dann das fertige CSS machen und abspeichern. Bei der nächsten Änderung wieder JSON laden und eben anders machen ;)

    Problematisch also eigentlich immer dann, wenn man keinen fixen Start- oder Endwert hat. Teilweise auch mit HTML-Tags, wenn die verschachtelt sind, oder willkürliches Zeug wie ein HTML-Link, der in 100 Varianten aufgebaut sein kann. Aber so wie da oben ist das eigentlich kein Problem. Da gibt es nur zwei Möglichkeiten. Wird ersetzt oder eben nicht.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Abakus Forumsfossil
    Wenn ich mir unsicher bin, ob das, was ich da vorhabe, auch wirklich zu 100 % klappt, dann lade ich mir halt die Tabelle/Spalten runter und bearbeite die local mit einem Editor, der RegExp kann.
    So sehe ich auch, ob wirklich ALLES so bearbeitet wird, wie ich das will oder ob da Leichen liegenbleiben.
    Man muss ja keine Operation am offenen Herzen machen, wenns nicht sein muss.

    Wer zuerst "Datenschutz" sagt, hat verloren.

  • Man muss ja keine Operation am offenen Herzen machen, wenns nicht sein muss.

    Kenn ich leider nur so... Also wo ich schon durch geschlittert bin, Wahnsinn. Aber hatte immer 'nen Backup, was ich nicht brauchte.

    wenn etwas möglich erscheint mach ich das, wenn das nicht klappt gehts ans unmögliche und ansonsten das undenkbare.

    - nun stolz rauchfrei - Ich denke also Bing ich!

    Support 24h Bereitschaft 0173 6107465 - NUR Für Kunden von SEO NW!