La méthode permalinkBuilder présentée ci-dessous permet de transformer une chaîne de caractère en une url valide appelée permalien.
La signature est la suivante :
/** * Cette méthode permet de construire une url valide à partir du libellé passé en paramètre. * Le libellé subit plusieurs transformations avant d'être retourné par la méthode : * * - remplacement des mots identifiés dans le paramètre wordsToReplace (case sentisitif) * - suppression des mots identifiés dans le paramètre wordsToRemove * - suppression des caractères accentués et mise en minuscule. * - suppression des unités de quantité au format décimal * - suppression des caractères non alphanumérics * - chaque mot est séparé par un - * @param lib : libellé à convertir * @param wordsToRemove : mots à supprimés séparés par des pipes (ex : le|la|les|de|du|des|à|aux ) * @param wordsToReplace : mot à remplacer séparés par des ; (ex: cinéma:ciné;%:pourcentage) */ public static String permalinkBuilder( String lib, String wordsToRemove, String wordsToReplace )
/*------------------------------------*/ /* Test unitaire de permalinkBuilder */ /*------------------------------------*/ ArrayListlibs = new ArrayList (); listLibWeb.add("Tout sur... l'echalote"); listLibWeb.add("Pljeskavica (hamburger des Balkans)"); listLibWeb.add("Magret de canard du Sud-Ouest (pièce de 300-400g)"); listLibWeb.add("8 palets de légumes courgettes/poivrons-brebis"); listLibWeb.add("Le P'tit Tendre"); listLibWeb.add("Portions de filets (4-6 p)"); listLibWeb.add("St Jacques, 1,2 à 1,7 kg"); String wordsToRemove = "le|la|les|de|du|des|à|aux"; String wordsToReplace = "P'tit:Ptit;(4-6 p):4 à 6 personnes"; /* Parcourir l'ensemble des libellés */ for (String s : libs ) { /* Convertir en permaliens */ String permalink = permalinkBuilder(s, wordsToRemove, wordsToReplace); System.out.println(permalink); }
Le résultat obtenu :
Tout sur… l’echalote
tout-sur-echalote
Pljeskavica (hamburger des Balkans)
pljeskavica-hamburger-balkans
Magret de canard du Sud-Ouest (pièce de 300-400g)
magret-canard-sud-ouest-piece-300-400g
8 palets de légumes courgettes/poivrons-brebis
8-palets-legumes-courgettes-poivrons-brebis
Le P’tit Tendre
ptit-tendre
Portions de filets (4-6 p)
portions-filets-4-6-personnes
St Jacques, 1,2 à 1,7 kg
st-jacques
et pour finir l’implémentation :
import java.text.Normalizer; import java.util.*; /** * Cette méthode permet de construire une url valide à partir du libellé passé en paramètre. * Le libellé subit plusieurs transformations avant d'être retourné par la méthode : * * - remplacement des mots identifiés dans le paramètre wordsToReplace (case sentisitif) * - suppression des mots identifiés dans le paramètre wordsToRemove * - suppression des caractères accentués et mise en minuscule. * - suppression des unités de quantité au format décimal * - suppression des caractères non alphanumérics * - chaque mot est séparé par un - * @param lib : libellé à convertir * @param wordsToRemove : mots à supprimés séparés par des pipes (ex : le|la|les|de|du|des|à|aux ) * @param wordsToReplace : mot à remplacer séparés par des ; (ex: cinéma:ciné;%:pourcentage) */ public static String permalinkBuilder( String lib, String wordsToRemove, String wordsToReplace ) { String permalink = ""; Dictionary dicWordsToReplace = new Hashtable(); String[] replaceTab = wordsToReplace.split(";"); /* Conserver les chaines à remplacer dans un dictionnaire */ for (int i = 0; i < replaceTab.length; ++i ) { if( replaceTab[i].split(":").length > 1 ) { dicWordsToReplace.put( replaceTab[i].split(":")[0], replaceTab[i].split(":")[1]); } } permalink = lib; if( permalink.length() <= 0 ) return ""; /* remplacer les mots identifiés dans le paramètre wordsToReplace (case sentisitif) */ for ( Enumeration e = dicWordsToReplace.keys(); e.hasMoreElements(); ) { Object elt = e.nextElement(); String regex = elt.toString(); String replacement = dicWordsToReplace.get(elt).toString(); permalink = permalink.replaceAll(regex, replacement); } permalink = permalink.toLowerCase(); /* Suppression des déterminants spécifiés dans le fichier ini (ex : le,la,les etc...) */ permalink = permalink.replaceAll("\\b(" + wordsToRemove + ")\\b", " "); /* Supprime les accents */ permalink = Normalizer.normalize(permalink, Normalizer.Form.NFD).replaceAll("[\u0300-\u036F]", ""); /* Concaténation des entiers à leur unité de quantité correspondante */ permalink = permalink.replaceAll("(\\d+)\\s+(kg|g|mg|l|dl|ml)\\b", "$1$2"); /* Supprimer les unités de quantité au format décimal */ permalink = permalink.replaceAll("\\d+,+\\d+(\\s*(kg|g|mg|l|dl|ml))?", ""); /* Supprimer les caractères non alphanuméric */ permalink = permalink.replaceAll("\\W", " "); /* Supprimer les chaines alpha d'un seul caractère */ permalink = permalink.replaceAll("\\s+\\D?\\s+", " "); /* Supprimer les doubles espaces */ permalink = permalink.replaceAll("\\s+", " "); /* Remplacer les espaces par un - */ permalink = permalink.replaceAll("\\s", "-"); /* Supprimer les - en début et fin de chaine */ permalink = permalink.replaceAll("(^-)|(-$)", ""); return permalink; }