|
|
Transformer un texte en url
Transformer un texte en url3 octobre 2008, par captain_torcheLa réécriture d’urls est quasi-incontournable de nos jours. Qu’il s’agisse de présenter des urls à caractère plus humain, ou de tenter d’améliorer son positionnement (bien que les mots dans l’url n’aient plus véritablement de poids), il est essentiel de pouvoir générer rapidement une url propre. Mais d’abord, commençons par définir ce qu’est une url propre. Selon moi, il s’agit d’une url :
Il existe une fonction PHP, urlencode(), qui fait en sorte de transformer une chaîne de caractères de manière à pouvoir la passer en url, mais elle ne convient pas pour obtenir quelque chose de propre : les espaces sont transformés en signe "+", ce qui n’est pas très agréable pour la lisibilité, et les caractères spéciaux (accents compris) sont changés en un signe pourcentage, suivi de deux chiffres hexadécimaux (un espace devient ’%20’, par exemple). C’est suffisant pour avoir une url valide, mais c’est loin d’être lisible, d’où la nécessité de développer quelque chose de plus poussé. Enlever les accentsPour commencer, nous allons nous atteler à la suppression des accents. Nombre de fonctions circulent sur Internet [1], mais je ne les trouve pas correctes : elles effectuent un remplacement caractère par caractère, si bien qu’il est nécessaire de renseigner deux fois chaque caractère, en version accentuée et non accentuée. De plus, si un caractère n’est pas prévu dans la liste, il n’est tout simplement pas remplacé. Je pars d’un constat différent : quand un caractère accentué est codé en HTML, il est toujours formé de la manière suivante :
Il nous suffit donc de lister tous les accents possibles, et nous sommes sûrs de cibler tous les caractères accentués imaginables. Je définis donc une expression régulière qui détectera chaque caractère accentué, et n’en conservera que la lettre. Il faudra bien entendu transformer tous les accents en leur équivalent HTML, avec la fonction htmlentities(). J’y précise le jeu de caractères UTF-8, sans quoi les ligatures "e dans l’o" (œ) ne seront pas correctement transformées. Enlever les ligaturesLes ligatures (e dans l’o, etc) ne sont pas affectées par l’expression régulière utilisée pour les caractères accentués, il nous faut donc une fonction supplémentaire pour les gérer. Suppression des caractères spéciauxMaintenant que tous les accents sont supprimés, nous allons supprimer les autres caractères spéciaux. Par caractère spécial, nous entendons "tout ce qui n’est pas une lettre ou un chiffre". Nous allons donc utiliser une autre expression régulière, qui ciblera cette fois-ci les caractères formés de la manière suivante :
L’expression est assez large, il sera donc indispensable de l’utiliser après les fonctions précédentes, sans quoi nous supprimerions également les accents et les ligatures. Il n’est pas nécessaire de transformer les entités HTML, puisque les fonctions seront enchaînées, et que la première le fait déjà. Suppression des tirets excédentairesÀ ce stade, nous obtenons quelque chose d’approchant nos désirs. Il ne reste plus qu’à réduire les éventuelles chaînes de tirets, et à supprimer les tirets de début et fin de texte. Nous commençons par mettre notre chaîne de caractères en minuscules : Pour transformer les chaînes de tirets, j’utilise encore une fois une expression régulière : Cette expression transforme toute suite de caractères qui n’est ni une lettre, ni un chiffre, en tiret. Elle nous permet par conséquent de transformer une suite de plusieurs tirets en un seul, mais permet également de supprimer des caractères spéciaux qui seraient éventuellement passés entre les mailles du filet précédent, ainsi que tous les signes de ponctuation. Pour finir, nous supprimons les tirets de début et de fin. La première fois que j’avais rédigé cette fonction, je testais le premier et le dernier caractère, et raccourcissais la chaîne au besoin. Je me suis toutefois demandé si une fonction PHP ne le faisait pas déjà nativement. Après quelques recherches, j’ai découvert que la fonction trim(), utilisée par défaut pour supprimer les espaces, tabulations et retours chariots autour d’une chaîne de caractère, pouvait prendre comme second argument, une liste de caractères supplémentaires à enlever. Le code se simplifie d’un seul coup, pour tenir en une seule ligne : Il ne nous reste plus qu’à assembler le tout dans une fonction, ce qui nous donne : J’ai ajouté une gestion de conversion de jeu de caractère, si le texte n’est pas en UTF-8. J’ai emprunté la fonction is_utf8() au code source de SPIP : PrécisionCette fonction ne marche que si les fichiers sont encodés en UTF-8. Je fournis la même fonction marchant en ISO dans les commentaires de l’article. Vous pouvez réagir à cet article sur le forum : Transformer un texte en url |
|
||
|