Mein Endgegner RegExp wieder mal

  • Immer und immer wieder versage ich total bei RegExp :(

    Diesmal wollte ich in MySql URL ändern. Ich habe da Aberhunderte von Links, die noch auf einen Ordner und .html-Seiten des alten Shops zeigen, die es nicht mehr gibt.

    Jetzt wollte ich die umschreiben von <a href="https://www.seiden-handel.de/catalog/meterw…ple-p-5631.html"> zu <a href="https://www.seiden-handel.de/seidenmuster">. Der Teil der URL "meterware-china-bourette-112cm-rich-purple-p-5631" ist bei jedem Link anders.

    Und ich habe versucht da RegExp in sowas einzubauen:

    UPDATE `xxx_posts` SET `post_content`= REPLACE(`post_content`, '"https://www.seiden-handel.de/catalog/[.*]"', '"https://www.seiden-handel.de/seidenmuster"');

    Was natürlich nicht funktionierte. Weil ich doof bin. :( Ich bin sogar zu doof, da im Internet ne passende Codezeile zu finden :(

    Hat jemand ne Idee, wie ich das bewerkstelligen kann?

    Wer zuerst "Datenschutz" sagt, hat verloren.

  • Ersetze Dein [.*] mal mit (.*)

    Und!!!!

    Ersetze Dein REPLACE mit REGEXP_REPLACE, das normale "Replace" kann nämlich kein RegEx. Sprich, in Deinem Fall sucht der nach einem String, der genau so ist.... "https://www.seiden-handel.de/catalog/[.*]". Das .* ist hier nur eine Zeichenkette in einem String, kein RegEx.

    Und Du solltest sicherstellen, dass das ganze nicht gierig ist bzw. limitieren auf Zeichen-Enden. Sonst ersetzt der alles in der Zelle, wenn es möglicherweise zwei Links darin gibt. Also " ausschließen. In etwa zumindest...


    '"https://www.seiden-handel.de/catalog/([^"]*).html"'

    Ohne so einen Ausschluss würde er ja bis zum nächsten " suchen, wenn es vorher keinen Treffer gab, aber dennoch ab dem Beginn an ersetzen.

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

  • Erstmal Damke :)

    Das hat bei EINER Tabelle funktioniert.
    Bei einer 2. in derselben DB aber schon wieder nicht mehr. Und ich hab nur das "SEojm3P_posts" und den Spaltennamen korrekt ersetzt. Seltsam.

    Dafür hats mir den Quelltext zur Anzeige der Bilder auf den Post-Seiten komplett gelöscht und die seitl. Menüleiste gekillt. ROFL
    Also Sachen, die gar nicht hätten passieren dürfen.
    Zum Glück hatte ich noch ein Backup der "SEojm3P_posts". Die seitliche Menüleiste ist aber immer noch im Nirvana.

    Siehste? Genau deshalb hasse ich RegEpx so sehr!

    Wer zuerst "Datenschutz" sagt, hat verloren.

  • Etzala^^
    Mann, bin ich gut :)

    Ich hab da jetzt einfach mal die Tags mit einbezogen und so gings dann.
    Das da hat gefunzt:

    UPDATE `xxx_posts` SET `post_content`= REGEXP_REPLACE(`post_content`, '<a href="https://www.seiden-handel.de/catalog/(.*)">', '<a href="https://www.seiden-handel.de/seidenmuster">');

    Da war noch ein Tag für einen Button, den hab ich dann auch so umgeschrieben:
    UPDATE `xxx_posts` SET `post_content`= REGEXP_REPLACE(`post_content`, '<a role="button" href="https://www.seiden-handel.de/catalog/(.*)">', '<a role="button" href="https://www.seiden-handel.de/seidenmuster">');

    Jetzt muss ich nur noch meine verschwundene Seitenleiste wiederfinden :)

    Wer zuerst "Datenschutz" sagt, hat verloren.

  • Wirklich seltsam. Wenn es mal geht, dann sollte es eigentlich immer gehen. Es sei denn, Dein Content ist grundlegend anders in den anderen Tabellen. Allerdings ist das so wie es ist ja ohnehin nicht wirklich sicher. Gut, das geht, kommt aber sehr auf den Content an.

    Da vorher ein ".html" dabei war, sollte es zumindest kein ,jpg ersetzen. Ebenso der Ausschluss von ", damit es nicht über einen Tag hinaus geht bzw. eben über ein href="" hinaus.

    Dein Code oben geht so, klar, wenn die Quelle exakt so ist und keinesfalls einen Fehler enthält. Wenn aus irgendeinem Grund das "> nach dem Link fehlt oder nur ein Leerzeichen dazwischen ist, dann ersetzt er alles bis zum nächsten Vorkommen der Kombination ">, im Zweifel also fast alles im Code.

    Dem ist so also völlig egal, was da alles kommt. Es muss mit der Domain beginnen und am Ende dann irgendwo ein "> kommen. Ob das ein Ende vom A-Tag ist oder nicht, das Ende von einem IMG oder einem Span, das Ende von sonstwas, ist völlig egal, denn (.*) ist einfach alles, ohne Ausschluss. Das geht also, wenn der Link exakt so aufgebaut ist, aber wehe, wenn nicht.

    Du solltest bei so was also einen Ausschluss einbauen, was im Suchmuster nicht vorkommen darf.

    Nicht einfach sagen ALLES (.*), sondern "ALLES AUßER >" mit ([^>]*), denn in einem HTML-Tag kann es kein > geben. Das gibt es nur am Ende, aber nicht mittendrin.

    Und ja, es ist immer besser, einen ganzen Tag zu nehmen und nicht nur einen Wert davon.

    Da passiert also dann gerne so was hier. Beachte die grün markierten Stellen, das sind eigentlich die variablen String in der URL, die mit (.*) gefunden werden sollen. Die blauen sind die Suchmuster am Anfang und Ende. Wenn es dumm läuft, ist das "grüne" aber viel mehr als gedacht.

    Wie man im zweiten Satz schön sieht, es gibt dort kein "> am Linkende, sondern nur mit Leerzeichen, also sucht er sich das nächste Vorkommen und ersetzt alles dazwischen. In dem Fall dann also den Link, denn der beginnt mit dem Domainnamen, aber bis über das Bild hinaus, denn danach kommt dann das erste ">.

    Mit einem Ausschluss von > würde er im zweiten Satz nichts ersetzen, denn er hat kein "> gefunden, bevor ein ausgeschlossenes > kommen würde.

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