Je suis à la recherche du meilleur moyen de "slugifier" la chaîne de ce qu'est "slug" , et ma solution actuelle est basée sur cette recette
Je l'ai un peu changé pour:
s = 'String to slugify'
slug = unicodedata.normalize('NFKD', s)
slug = slug.encode('ascii', 'ignore').lower()
slug = re.sub(r'[^a-z0-9]+', '-', slug).strip('-')
slug = re.sub(r'[-]+', '-', slug)
Quelqu'un voit-il des problèmes avec ce code? Cela fonctionne bien, mais peut-être que je manque quelque chose ou que vous connaissez une meilleure façon?
Réponses:
Il existe un package python nommé
python-slugify
, qui fait un très bon travail de slugification:Fonctionne comme ceci:
Voir plus d'exemples
Ce paquet fait un peu plus que ce que vous avez publié (jetez un œil à la source, ce n'est qu'un fichier). Le projet est toujours actif (a été mis à jour 2 jours avant ma réponse initiale, plus de sept ans plus tard (dernière vérification le 30/06/2020), il est toujours mis à jour).
attention : il y a un deuxième paquet autour, nommé
slugify
. Si vous possédez les deux, vous risquez de rencontrer un problème, car ils portent le même nom pour l'importation. Celui que je viens de nommerslugify
n'a pas fait tout ce que j'ai vérifié rapidement:"Ich heiße"
est devenu"ich-heie"
(devrait être"ich-heisse"
), alors assurez-vous de choisir le bon, lorsque vous utilisezpip
oueasy_install
.la source
python-slugify
est sous licence MIT, mais il utiliseUnidecode
ce qui est sous licence GPL, il peut donc ne pas convenir à certains projets.python-slugify
désormais par défaut la licence artistique autext-unidecode
lieu de la licence GPLUnidecode
, ce qui répond à votre problème de licence. github.com/un33k/python-slugify/commit/…Installez le formulaire Unidecode à partir d'ici pour le support Unicode
la source
slugify("My custom хелло ворлд")
parslugify(u"My custom хелло ворлд")
, et cela devrait fonctionner.str
. Cela masque lestr
type intégré .Il existe un package python nommé awesome-slugify :
Fonctionne comme ceci:
page github génial-slugify
la source
slugify(text).lower()
si vous le souhaitez.Cela fonctionne bien dans Django , donc je ne vois pas pourquoi ce ne serait pas une bonne fonction slugify à usage général.
Avez-vous des problèmes avec cela?
la source
from django.utils.text import slugify
Le problème vient de la ligne de normalisation ascii:
C'est ce qu'on appelle la normalisation unicode qui ne décompose pas beaucoup de caractères en ascii. Par exemple, cela supprimerait les caractères non-ascii des chaînes suivantes:
Une meilleure façon de le faire est d'utiliser le module unidecode qui essaie de translittérer les chaînes en ascii. Donc, si vous remplacez la ligne ci-dessus par:
Vous obtenez de meilleurs résultats pour les chaînes ci-dessus et pour de nombreux caractères grecs et russes également:
la source
C'est la fonction slugify présente dans django.utils.text Cela devrait suffire à vos besoins.
la source
Unidecode est bon; cependant, soyez prudent: unidecode est GPL. Si cette licence ne convient pas, utilisez celle-ci
la source
Quelques options sur GitHub:
Chacun prend en charge des paramètres légèrement différents pour son API, vous devrez donc examiner ce que vous préférez.
En particulier, faites attention aux différentes options qu'ils offrent pour traiter les caractères non ASCII. Pydanny a écrit un article de blog très utile illustrant certaines des différences de gestion Unicode dans ces bibliothèques slugify'ing: http://www.pydanny.com/awesome-slugify-human-readable-url-slugs-from-any-string.html Ce billet de blog est légèrement obsolète car celui de Mozilla
unicode-slugify
n'est plus spécifique à Django.Notez également qu'il
awesome-slugify
s'agit actuellement de GPLv3, bien qu'il y ait un problème ouvert où l'auteur dit qu'il préférerait publier en tant que MIT / BSD, mais pas sûr de la légalité: https://github.com/dimka665/awesome-slugify/issues/ 24la source
Vous pouvez envisager de remplacer la dernière ligne par
puisque le modèle
[-]+
n'est pas différent de-+
, et que vous ne vous souciez pas vraiment de faire correspondre un seul trait d'union, seulement deux ou plus.Mais, bien sûr, c'est assez mineur.
la source
Une autre option est
boltons.strutils.slugify
. Boltons a également quelques autres fonctions utiles et est distribué sousBSD
licence.la source