Oggi ho dovuto rimettere mano ad uno dei miei vecchi siti in PHP per risolvere alcuni probelmi: per farla breve, ho avuto la necessità di trovare il modo di trasformare un elevato numero di titoli di articolo in slug che potessero funzionare come permalink, quindi trasformando tutti gli accenti, trattini, underscore e altri caratteri inadeguati nella loro versione "naturale", quando non eliminandoli del tutto.
Dopo alcune riflessioni ho deciso di risolvere il problema a livello DB anziché applicativo, utilizzando la seguente funzione:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
CREATE FUNCTION toSlug(s NVARCHAR(500)) RETURNS NVARCHAR(500) DETERMINISTIC RETURN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( REPLACE(REPLACE(LOWER(TRIM(s)), ':', ''), ')', ''), '(', ''), ',', ''), '\\', ''), '/', ''), '"', ''), '?', ''), "'", ''), '&', ''), '!', ''), '.', ''), ' ', '-'), '--', '-'), '--', '-'),'ù','u'), 'ú','u'),'û','u'),'ü','u'),'ý','y'),'ë','e'),'à','a'),'á','a'),'â','a'),'ã','a'), 'ä','a'),'å','a'),'æ','a'),'ç','c'),'è','e'),'é','e'),'ê','e'),'ë','e'),'ì','i'), 'í','i'),'ě','e'), 'š','s'), 'č','c'),'ř','r'), 'ž','z'), 'î','i'),'ï','i'),'ð','o'), 'ñ','n'),'ò','o'),'ó','o'),'ô','o'),'õ','o'),'ö','o'),'ø','o'),'%', ''); |
Una volta creata, è possibile richiamarla nel seguente modo direttamente dall'interno di una qualsiasi query eseguita su quello stesso DB:
1 |
SELECT toSlug("Try Me With This String containing a Bunch of Pesky Characters at the end! àéìòù?/("); |
La query di cui sopra dovrebbe restituire il seguente bug:
1 |
try-me-with-this-string-containing-a-bunch-of-pesky-characters-at-the-end-aeiou |
La funzione sviluppata è stata pù che sufficiente per consentirmi di risolvere il problema che avevo: ho deciso di pubblicarla sperando che possa essere di aiuto anche ad altri sviluppatori e sistemisti. A presto!