Graag was ik op zoek naar de 'best-practice' om een deel van een string aan te passen in de records van een tabel.

Dit wil ik doen omdat de afbeeldingen een andere bestandsnaam krijgen. Ik dacht zelf (nog ongetest) aan zo een soort query.


UPDATE nieuws
SET 
    content = REPLACE(content,
        oude_image.jpg,
        nieuwe_image_0656.jpg)


Echter loop ik tegen het probleem aan dat in de <img src=""> tag bijvoorbeeld a.jpg staat. En dat er ook bijv. banana.jpg in kan staan. Dit moet dus genegeerd worden.

Wat is de beste manier om dit aan te pakken? De REPLACE moet namelijk alleen plaatsvinden in de hele src-attribuut.
Ik weet niet wat de beste manier is, maar wellicht is een betere manier een indirecte koppeling naar je media. Je maakt bijvoorbeeld een soort van UBB-code die vervolgens linkt naar een afbeelding, bijvoorbeeld [image=4]omschrijving[/image]. Die 4 wijst dan naar de daadwerkelijke afbeelding. Je hebt dan zowel een kolom voor deze UBB-variant, en je zou in een andere kolom een HTML-variant kunnen cachen. Wat je dan doet is gewoon de cache flushen zodat de eerste persoon die dat bericht bekijkt dan een cache-update triggert. Je hoeft dan dus nooit meer specifieke instanties te gaan zoeken maar als dit soort wijzigingen optreden gooi je gewoon de cache leeg en klaar.

Het probleem ontstaat dus in eerste instantie door hard coding. Als je deze hard coding wegneemt, is het vervolgprobleem, wat hier in feite een symptoom van is, ook verdwenen.
Dat is een mooie oplossing maar momenteel niet echt triviaal. Wel leuk voor een vervolgproject. (of ik moet mijn roadmap weer uitbreiden en planning omgooien waar ik echt geen zin in heb :p )

Voor nu wil ik de bestandsnamen aanpassen. Ik dacht aan DOMdocument, en het replacewerk dan niet door SQL te doen, maar met een toffe functie binnen deze standaard class.

Of is er nog wat simpelers?
- Ariën - op 03/12/2018 15:31:18
De REPLACE moet namelijk alleen plaatsvinden in de hele src-attribuut.

Dan heb je daar al min of meer het antwoord - neem de quotes ook mee :).
Inderdaad, maar kan dit ook simpel met een ander truukje in SQL of is DOMdocument effectiever en handiger?
Hm, dat moet wel goed komen dan. Zo te zien zit het ook in MariaDB

Wat is er eenvoudiger dan de quotes meenemen in de vervanging? Een regex doet even veel/weinig als een REPLACE in jouw case?
Ik ga er mee aan de slag.
@Thomas: als de quotes altijd consistent zijn is een REPLACE inderdaad beter/sneller/eenvoudiger. Maar als er bijvoorbeeld enkele en dubbele quotes zijn gebruikt, of bepaalde afbeeldingen met een bepaalde prefix wel/niet moeten worden vervangen, dan kun je met een regex net even dat beetje meer doen.
Maar als er bijvoorbeeld enkele en dubbele quotes zijn gebruikt

Als er geen lijn in de HTML zit is er geen enkele garantie dat een regexp je gaat redden, het probleem ligt dan toch echt tussen de spreekwoordelijke Stoel en het Toetsenbord.

of bepaalde afbeeldingen met een bepaalde prefix wel/niet moeten worden vervangen

Maar dan ben je dus naar patronen op zoek, en vervang je waarschijnlijk ook meerdere bestanden met verschillende namen in welk geval een regexp natuurlijk geschikter is voor deze klus.

Reageren