Pulsar-san Posté 8 Janvier 2009 Posté 8 Janvier 2009 (modifié) Hum, l'intéret d'une telle fonction est tout de même assez limitée. En effet, les RFC 3986 et 3987, datant de 2005 et créées dans le cadre de l'internationalisation du Web, précisent bien que les accents et les lettres non latines peuvent être utilisées dans les URI. D'ailleurs, une url comme celle-ci : -http://xxxxxxxxx/userinfo/池田.html ou celle-ci : -http://xxxxxxxxx/userinfo/Никита.html fonctionnent parfaitement. Même un nom de domaine en kanji devrait être correctement interprété. Modifié 8 Janvier 2009 par Pulsar-san
captain_torche Posté 8 Janvier 2009 Auteur Posté 8 Janvier 2009 L'avantage d'avoir des urls alphanumériques sans accent, c'est que chacun peut saisir une adresse à la main. Si je mets un accent dans mon url, j'empêche potentiellement une grande partie du monde de saisir l'adresse à la main. A plus forte raison avec une url en kanji ou cyrillique.
x12345 Posté 16 Février 2009 Posté 16 Février 2009 Bonjour, Pouvez-vous m'expliquer comment se servir de ces fonctions ? Dès que je veux les mettre dans ma page j'ai un message d'erreur PHP me disant que la fonction est déjà déclarée et qu'il n'est pas possible de la re-déclarer, mais je ne déclare la fonction qu'une seule fois pourtant : Fatal error: Cannot redeclare enleve_accents() (previously declared in H:\news2.php:368) in H:\news2.php on line 368 Evidemment je ne déclare pas la fonction sur la même ligne donc je ne comprends pas le message d'erreur... J'ai mis les fonctions à la suite dans mon code, de cette façon : $texte = $post_subject; function enleve_accents($chaine) { $reg = '/&(.)(acute|grave|circ|uml|cedil|ring|tilde|slash);/'; return preg_replace($reg, '\1', htmlentities($chaine, ENT_COMPAT, 'UTF-8')); } function enleve_ligatures($chaine) { $chaine = str_replace('ß', 'ss', $chaine); $reg = '|&([a-zA-Z]{2})lig;|'; return preg_replace($reg, '\1', $chaine); } function suppr_speciaux($chaine) { $reg = '|(&[a-zA-Z0-9]*|U'; return preg_replace($reg, '-', $chaine); } function nettoie_url($texte) { if(!is_utf8($texte)) $texte = utf8_encode($texte); $texte = strtolower(suppr_speciaux(enleve_ligatures(enleve_accents($texte)))); $reg = '|([^a-z0-9]+)|'; $texte = preg_replace($reg, '-', $texte); return trim($texte, '-'); } Est ce que c'est bien comme ça qu'il faut faire ? Ou il faut inclure des prototypes quelque part ?
captain_torche Posté 16 Février 2009 Auteur Posté 16 Février 2009 Logiquement ça devrait fonctionner, même si ce n'est pas la solution la plus propre. Pourrais-tu coller l'ensemble de ton code ?
Xethorn Posté 29 Décembre 2009 Posté 29 Décembre 2009 La conversion de texte en url est problematique meme pour des sites comme Google, surtout depuis l'arrivee du deeplinking. Pour le moment, Gmail fonctionne tres bien lorsqu'un lien est entoure des <>. Exemple: <http://monsiteweb.com/#deeplinkin/:step>. Il est desormais possible de mettre tout et rien. Les algorithmes les plus simples consistent a chercher le prochain espace ... mais ne fonctionne pas du tout avec les pages web du style: "http://monsiteweb.com/mais il est fou.html#il a bifurque". Jusqu'a aujourd'hui, je n'ai pas trouve de solution universelle (excepte en encapsulant). My 2 cents.
captain_torche Posté 29 Décembre 2009 Auteur Posté 29 Décembre 2009 Là, c'est un peu différent : tu parles de détection d'url dans un texte, et l'article de base ne parle "que" de modification de texte Dans l'idéal, il faudrait trouver (ou concocter) une expression régulière qui respecte toutes les formes différentes que puisse prendre une url : protocoles différents, présence ou non du préfixe http://, mention éventuelle du port, tous les caractères autorisés, les paramètres et les ancres. Ca doit pouvoir se faire
Solution SStephane Posté 3 Septembre 2011 Solution Posté 3 Septembre 2011 Propre et net : function compute_string_for_url($str){ $str = preg_replace('~[^\\pL\d]+~u', '-', $str); $str = trim($str, '-'); $str = iconv('utf-8', 'us-ascii//TRANSLIT', $str); $str = strtolower($str); $str = preg_replace('~[^-\w]+~', '', $str); return $str;}
captain_torche Posté 4 Septembre 2011 Auteur Posté 4 Septembre 2011 Je testerai, ça a l'air bien plus simple que la mienne. Que fait la première regex ?
captain_torche Posté 5 Septembre 2011 Auteur Posté 5 Septembre 2011 Je viens de tester, et effectivement ta fonction est géniale ! Je n'arrive pas à la faire fonctionner en partant d'une chaîne en ISO, par contre.
SStephane Posté 8 Septembre 2011 Posté 8 Septembre 2011 Hello, la première remplace tout ce qui n'est pas unicode et numérique en '-' C'est quoi l'iso déjà ? Plus sérieusement => mb_convert_encoding() Je ne modifie pas les entités html, je n'en vois pas l'intérêt mais ta fonction le fait très bien et mixer les 2 dans ces cas là peut être nécessaire.
captain_torche Posté 8 Septembre 2011 Auteur Posté 8 Septembre 2011 Effectivement, pas besoin de convertir les entités HTML : ta fonction iconv est géniale pour ça, je ne connaissais pas du tout cette utilisation !
khalid-ref Posté 30 Juillet 2014 Posté 30 Juillet 2014 Un lien util que j'ai utilisé et ça marche bien : forum.webrankinfo.com/convertir-texte-pour-url-php-t154452.html
captain_torche Posté 30 Juillet 2014 Auteur Posté 30 Juillet 2014 Heu ... Si je prends le corpus suivant : Athènes Gdańsk Poznań Wrocław Iaşi Das große Eszett L'œuvre, de sa vie El niño Ma fonction renvoie ceci : athenes gdansk poznan wroclaw iasi das-grosse-eszett l-oeuvre-de-sa-vie el-nino Alors que la fonction que tu lies renvoie ceci (J'ai adapté pour qu'elle prenne à partir d'un caractère) : athenes gda-sk pozna wroc-aw ia das-gro-eszett uvre-de-sa-vie el-nino La conclusion s'impose d'elle-même, je pense.
sparh Posté 10 Novembre 2015 Posté 10 Novembre 2015 Le 3/9/2011 15:57:28, SStephane a dit : function compute_string_for_url($str){ $str = preg_replace('~[^\\pL\d]+~u', '-', $str); $str = trim($str, '-'); $str = iconv('utf-8', 'us-ascii//TRANSLIT', $str); $str = strtolower($str); $str = preg_replace('~[^-\w]+~', '', $str); return $str; } Bonjour, je revient sur la fonction proposée par SStephane. Je viens d'installer un nouveau site chez Infomaniak et d'un coup ça ne fonctionne plus : Voilà mon script : $chaine = 'Test d\'une chaine î í é è à'; echo mb_detect_encoding($chaine).'<br />'; echo $chaine.'<br />'; echo compile_string_for_url($chaine); Le résultat normal : UTF-8 Test d'une chaine î í é è à test-d-une-chaine-i-i-e-e-a Chez Infomaniak UTF-8 Test d'une chaine î í é è à test-d-une-chaine----- Auriez-vous une idée de ce qui pourrait poser ce problème ? Merci d'avance
Dan Posté 10 Novembre 2015 Posté 10 Novembre 2015 Tu définis la fonction comme compute_string... et tu l'appelles comme compile_string... :?:
sparh Posté 10 Novembre 2015 Posté 10 Novembre 2015 (modifié) Je me suis trompé en recopiant, voilà un copié/collé de ma page function create_url2($str){ $str = preg_replace('~[^\\pL\d]+~u', '-', $str); $str = trim($str, '-'); $str = iconv('utf-8', 'us-ascii//TRANSLIT', $str); $str = strtolower($str); $str = preg_replace('~[^-\w]+~', '', $str); return $str; } $chaine = 'Test d\'une chaine î í é è à'; echo mb_detect_encoding($chaine).'<br />'; echo $chaine.'<br />'; echo create_url2($chaine); die(); Le résultat normal : UTF-8 Test d'une chaine î í é è à test-d-une-chaine-i-i-e-e-a Chez Infomaniak UTF-8 Test d'une chaine î í é è à test-d-une-chaine----- Modifié 10 Novembre 2015 par sparh
captain_torche Posté 12 Novembre 2015 Auteur Posté 12 Novembre 2015 Le souci doit venir de la locale déclarée par ton script PHP. Essaye en y ajoutant, par ordre de préférence, la locale suivante (en début de script) : // Teste chacune de ces deux lignes indépendamment l'une de l'autre setlocale(LC_CTYPE, 'fr_FR'); setlocale(LC_CTYPE, 'fr_FR.utf8'); // Si jamais le français n'est pas disponible sur ton serveur, tu peux utiliser l'un de ces deux appels setlocale(LC_CTYPE, 'en_US'); setlocale(LC_CTYPE, 'en_US.utf8'); Si tu as un accès SSH à ton serveur, la commande "locale -a" te permet de connaître les locales installées.
sparh Posté 13 Novembre 2015 Posté 13 Novembre 2015 Merci beaucoup captain_torche, la première ligne fonctionne très bien. setlocale(LC_CTYPE, 'fr_FR');
Dan Posté 13 Novembre 2015 Posté 13 Novembre 2015 Que donnent les variables $LANG et $LC_ALL ? J'aurais plutôt tendance à utiliser setlocale(LC_ALL, 'fr_FR.UTF8');
sparh Posté 13 Novembre 2015 Posté 13 Novembre 2015 Saucisse comme je suis je ne sait pas comment afficher les variables dont tu parle Dan (un echo ne renvoi rien en tout cas) et le SSH j'y ai accès mais je ne m'y suis toujours pas mis J'ai appliquer ta recommandation en tous cas.
Dan Posté 13 Novembre 2015 Posté 13 Novembre 2015 Sur ton serveur dédié, LC_ALL est positionné à fr_FR.UTF-8 Donc ça c'est bon, et ça fonctionne ! Chez Infomaniak, je ne peux pas vérifier
captain_torche Posté 14 Novembre 2015 Auteur Posté 14 Novembre 2015 @Dan, j'avais eu un souci de conversion de devises plus loin dans un site qui utilisait ce script. J'étais tombé sur un commentaire sur PHP.net qui l'expliquait bien, mais il a disparu. Il reste celui-ci qui parle d'un souci similaire : http://fr.php.net/manual/fr/function.setlocale.php#25041
Dan Posté 14 Novembre 2015 Posté 14 Novembre 2015 @captain_torche, je n'ai jamais rencontré ce souci, mais il peut effectivement survenir. Mais chez moi j'avais positionné LC_ALL avant de créer la moindre base de données, lors de l'installation de Debian. Donc je n'ai pas eu à faire face à ce problème de point décimal (ou virgule)
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant