Replace-Befehl in MySQL mit "Platzhalter"

  • Servus,


    in Artikeln sollen Zwischentitel vom Tag <p> auf <h3> geändert werden.


    Ich bin auf der Suche nach einem MySQL-Befehl, in dem ich den Text zwischen den öffnenden und schließendem Tag als Variable für den tatsächlichen Text markieren kann (in Dokus zu MySQL-Befehlen habe ich keine funktionierende Lösung gefunden).


    Beispiel:


    Damit soll nur das Tag ersetzt werden, die tatsächlichen Zwischentitel bleiben gleich.


    Wenn das nicht funktioniert, mache ich jeden Artikel im JCE auf und suchen/ersetze die öffnenden Tags (die schließenden werden vom JCE automatisch korrekt gesetzt). Das will ich bei 4500 Artikel vermeiden.


    Servus und Danke im Voraus für eure Antworten

    • Hilfreich

    Es gibt mehrere Methoden, wie man sowas bewerkstelligen kann. Wenn du das direkt in phpMyAdmin machen willst, kommst du um die Verwendung von regulären Ausdrücken nicht herum, und solltest erst noch einigermassen fit bezüglich SQL sein.


    Es geht aber einfacher, sofern du einen gescheiten Texteditor hast. Ich würde

    • Die Tabelle mit den Beiträgen exportieren und lokal abspeichern
    • Mit meinem Texteditor öffnen
    • Alle P-Tags mit Suchen & Ersetzen nach H3 konvertieren (natürlich auch die Schliessenden) und ansonsten die Struktur der Tabelle aber nicht anfassen
    • Das Ergebnis wieder in die Tabelle importieren (Tabelle erst leeren)

    Das Ganze logischerweise nicht ohne einen kompletten db Backup.

  • Curly BracketS hat leider recht, nur nicht in einem Punkt. Es macht hinsichtlich des Ergebnisses keinen Unterschied, wo man die Operation ausführt, am lebenden Herzen der Datenbank bzw. vorsichtshalber in einer Kopie der Tabelle oder Datenbank oder in einem Texteditor. Und ganz einfach ist es auch nicht, man benötigt hier für das schließende p in jedem Fall einen regulären Ausdruck.


    Ich mach sowas gewohnheitsmäßig mit dem Editor Textwrangler (Mac), Suchen und Ersetzen mit Grep. Natürlich bieten auch andere gute Texteditoren reguläre Ausdrücke an.




    Bei 4500 Beiträgen wirst du vielleicht Probleme haben, die Datenmenge im Stück wieder mit phpmyadmin zu importieren. Tipp: Prüfe das zunächst erst mal.

  • In deinem Text steht, beabsichtigt oder nicht, dass in diesem Fall nur mit phpmyadmin reguläre Ausdrücke nötig sind. Daher habe ich mir die Korrektur erlaubt.


    Zitat

    Wenn du das direkt in phpMyAdmin machen willst, kommst du um die Verwendung von regulären Ausdrücken nicht herum, und solltest erst noch einigermassen fit bezüglich SQL sein.


    Es geht aber einfacher, sofern du einen gescheiten Texteditor hast.

  • @addi TextWrangler ist auch der meine. Upload-Größe ginge sich aus. Danke für den Hinweis.


    @CurlY BracketS Nach 2 Ersetzen-Durchgängen (zuerst <p class... in <h3 class..., dann alle </p> in </h3>) in MySQL zeigen Browser korrekt an. Im Quellcode steht zwar der falsche schließende Tag, aber lt. HTML ist der gar nicht zwingend nötig bzw. beim Testen alter IE (bis 5) klappt die Darstellung. Habe ich was übersehen oder spricht was gegen diesen Weg?


    Anmerkung: Direkt in MySQL hat gegenüber dem Export der Tabelle den Vorteil, dass Redakteure weiterarbeiten können (neue Artikel werden über JCE eh mit der neuen Syntax erstellt).

  • Ich kann nicht sagen, wieso du den falschen Tag siehst, ich denke aber, dass es seit HTML 3.2 immer so war, dass h-Tags geschlossen werden müssen. Wenn deine Browser das in Ordnung finden, wohlan. Kottekt ist es aber deshalb noch lange nicht. Siehe auch hier.

  • Im Textwrangler klappt der Austausch der Tags mit dem Suchen/Ersetzen-Pärchen von @addi. In MySQL wird im Suchen-Teil (.*) ignoriert, also Syntax stimmt, nur der Wert (.*) muß offenbar ein anderer sein.


    Habt ihr einen Tipp, was ich in MySQL eintragen muß? Ich möchte diese Arbeiten in MySQL erledigen, um keine Downzeiten für Redakteure zu produzieren.


    Falls das nicht klappt, werde ich den von @CurlY BracketS vorgeschlagenen Weg mit Textwrangler gehen.

  • da war ich natürlich und hab einiges versucht: von '.*' über ".*" und {.*} oder [.*] sowie `.*`, auch ohne (). Leider alles erfolgslos, die Syntax stimmt (also keine Fehlermeldung), nur eben keine Änderung.


    Wenn ich nur <p class="zwischentitel"> suche, wird erfolgreich ersetzt, erst ab "<p class="zwischentitel">(.*)" bleibt die Abfrage folgenlos.

  • Noch mal nachgelesen, ein Ersetzen ist mit REGEXP nicht drin, du kannst nur die Auswahl ähnlich wie mit LIKE begrenzen, es liefert nur eine Wahrheitswert 0 oder 1 zurück.


    SELECT * FROM `#__content` WHERE title REGEXP ".*auf.*";


    würde alle Beiträge anzeigen, die auf im Titel enthalten.


    Also mit PHP in einer Schleife, am besten dabei die Ausführungszeit nach oben, oder mit der Editor-Methode, wenn nicht so viele Schreiben. ;)


    Und du kannst mit dem Plugin rereplacer in der kommerziellen Version die Ausgabe derart ändern, kostet halt minimal Serverzeit.

  • Dieser Ablauf führte zum gewünschten Ergebnis:

    • Backup
    • Export der Tabelle als *.csv
    • TextWrangler:
      Suche: <p class=\\"classname\\">(.*)</p>
      Ersetze: <h3 class=\\"classname\\">\1</h3>
    • Leeren der Tabelle und Import in MySQL

    Anmerkungen:

    • Der Upload der 27 MB-Tabelle hat einige Minuten benötigt. Deswegen habe ich für die gesamte Zeit das Frontend-Editing deaktiviert (keine Redakteurin kann einen Artikel öffnen) und die paar Minuten ohne Artikel am Wochenende in Kauf genommen.
    • Es gab Artikel, die aus mir unbekannten Gründen Suchen+Ersetzen ignorierten. Die habe ich in MySQL suchen lassen und im JCE mit Suche=<p class="classname"> auf Ersetze=<h3 class="classname"> geändert. Beim Speichern des Artikels ändert JCE den falschen auf den richtigen schließenden Tag.


    Danke nochmal an alle, die mir geholfen haben.