Je veux avoir une fonction pour créer des slugs à partir de chaînes Unicode, par exemple gen_slug('Andrés Cortez')
devrait retourner andres-cortez
. Comment dois-je faire ça?
php
internationalization
slug
Andres SK
la source
la source
andres
. Etes-vous sûr que votre entrée est exactement "andrés"?Réponses:
Au lieu d'un long remplacement, essayez celui-ci:
Ceci était basé sur celui du tutoriel Jobeet de Symfony.
la source
^
juste après le crochet d'ouverture - il inverse le match.iconv
ne sera pas converti correctement s'il$text
contient des caractères qui n'ont pas d'équivalent ascii. Par exempleiconv('utf-8', 'us-ascii//TRANSLIT', "EFI收购Cretaprint")
retournera"EFI"
et fuira un avertissement.$text = trim($text, '-');
devrait être à la fin,Foo 收
devient autrementfoo-
. Aussi,Foo 收 Bar
devientfoo--bar
(le répété-
semble redondant).Mettre à jour
Puisque cette réponse retient l'attention, j'ajoute quelques explications.
La solution fournie remplacera essentiellement tout sauf AZ, az, 0-9 et - (tiret) par - (trait d'union). Donc, cela ne fonctionnera pas correctement avec d'autres caractères Unicode (qui sont des caractères valides pour un slug / chaîne d'URL). Un scénario courant est lorsque la chaîne d'entrée contient des caractères non anglais.
N'utilisez cette solution que si vous êtes sûr que la chaîne d'entrée ne contiendra pas de caractères Unicode que vous voudrez peut-être faire partie de output / slug.
Par exemple. "नारी शक्ति" deviendra "----------" (tous les traits d'union) au lieu de "नारी-शक्ति" (slug d'URL valide).
Réponse originale
Que diriez-vous...
?
la source
strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', "Étienne")))
renvoie"-tienne"
au lieu de"etienne"
, donc cela ne fonctionne pas avec les caractères accentués.Si l' extension intl est installée, vous pouvez utiliser la fonction Transliterator :: transliterate pour créer facilement un slug.
la source
Remarque: j'ai pris ceci de wordpress et cela fonctionne !!
Utilisez-le comme ceci:
Code
la source
sanitize_title_with_dashes($string, null, 'save')
(notez les paramètres supplémentaires), sinon vous obtenez des codes de caractères désordonnés commetelstra%e2%80%99s-%e2%80%98all-roles-flex%e2%80%99
. Pas très joli. :-(sanitize
est un nom de fonction étrange et oubliable pour générer un slug.C'est toujours une bonne idée d'utiliser des solutions existantes qui sont prises en charge par de nombreux développeurs de haut niveau. Le plus populaire est https://github.com/cocur/slugify . Tout d'abord, il prend en charge plus d'une langue et est en cours de mise à jour.
Si vous ne souhaitez pas utiliser l'ensemble du package, vous pouvez copier la partie dont vous avez besoin.
la source
En voici un autre, par exemple "Titre avec des caractères étranges ééé AX Z" devient "titre-avec-des-caractères-étranges-eee-axz".
la source
Une version mise à jour du code @Imran Omar Bukhsh (de la dernière branche Wordpress (4.0)):
Voir l' exemple en ligne .
la source
%c2%abgq%c2%bb-elyas-mbarek-geh%c3%b6rt-zu-m%c3%a4nnern-des-jahres
la source
N'utilisez pas preg_replace pour cela. Il y a une fonction php construite juste pour la tâche: strtr () http://php.net/manual/en/function.strtr.php
Tiré des commentaires dans le lien ci-dessus (et je l'ai testé moi-même; cela fonctionne:
la source
J'utilise:
La seule solution de rechange est que les caractères cyrilliques ne seront pas convertis et je recherche maintenant une solution qui ne soit pas longue str_replace pour chaque caractère cyrillique.
la source
set_locale('cyrillic.UTF-8')
abord. La valeur exacte dépend de vos paramètres régionaux installés.Je ne savais pas lequel utiliser alors j'ai fait un banc rapide sur phptester.net
Début :
Résultats de sortie:
D'autres tests sont nécessaires.
Edit: test moins d'itérations
Début :
Résultats de sortie:
la source
Vous pouvez jeter un oeil à
Normalizer::normalize()
, voir ici . Il suffit de charger le module intl pour PHPla source
Qu'en est-il d'utiliser quelque chose qui est déjà implémenté dans Core?
Ou l'une des principales méthodes de réécriture d'url / url.
la source
Étant donné que les gTLD et les IDN sont de plus en plus utilisés, je ne vois pas pourquoi l'URL ne devrait pas contenir Andrés.
Juste rawurlencode $ URL que vous voulez à la place. La plupart des navigateurs affichent des caractères UTF-8 dans les URL (pas certains anciens IE6 peut-être) et bit.ly / goo.gl peut être utilisé pour le rendre court dans des cas comme le russe et l'arabe si nécessaire à des fins publicitaires ou simplement les écrire dans des publicités comme l'utilisateur les écrirait sur l'URL du navigateur.
La seule différence est les espaces "". Il peut être judicieux de les remplacer par "-" et "/" si vous ne voulez pas les autoriser.
URL encodée http://www.hurtta.com/RU/%D0%9F%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B/
URL telle qu’écrite http://www.hurtta.com/RU/Продукты/
la source
J'ai écrit ceci sur la base de la réponse de Maerlyn. Cette fonction fonctionnera quel que soit le codage des caractères sur la page. Il ne transformera pas non plus les guillemets simples en tirets :)
la source
sur mon hôte local, tout allait bien, mais sur le serveur, cela m'a aidé "set_locale" et "utf-8" à "mb_strtolower".
la source
La manière la plus élégante que je pense est d'utiliser un Behat \ Transliterator \ Transliterator.
J'ai besoin d'étendre cette classe par votre classe car c'est un résumé, certains comme ceci:
Et puis, utilisez-le simplement:
Bien sûr, vous devriez également mettre ces choses dans votre compositeur.
Plus d'informations ici https://github.com/Behat/Transliterator
la source
Il y a une bonne solution ici qui traite également des caractères spéciaux.
Texto Fantástico => texto-fantastico
Auteur: Natxet
la source
Cela peut aussi être une façon de le faire. Inspiré de ces liens Experts-échange et alinalexander
la source
Depuis que j'ai vu beaucoup de méthodes ici, mais j'ai trouvé la méthode la plus simple pour moi-même, peut-être que cela aidera quelqu'un.
la source
Pour moi, cette variante est parfaite, elle change également
&
enand
. Voici le code:la source