Aller au contenu
captain_torche

Transformer un texte en url

Noter ce sujet :

Recommended Posts

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é par Pulsar-san

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Logiquement ça devrait fonctionner, même si ce n'est pas la solution la plus propre. Pourrais-tu coller l'ensemble de ton code ?

Partager ce message


Lien à poster
Partager sur d’autres sites

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: &lt;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: &quot;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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

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;
}

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 !

Partager ce message


Lien à poster
Partager sur d’autres sites

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.


Partager ce message


Lien à poster
Partager sur d’autres sites
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

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu définis la fonction comme compute_string... et tu l'appelles comme compile_string... :?:

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par sparh

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci beaucoup captain_torche, la première ligne fonctionne très bien.

setlocale(LC_CTYPE, 'fr_FR');

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Que donnent les variables $LANG et $LC_ALL ?

 

J'aurais plutôt tendance à utiliser

setlocale(LC_ALL, 'fr_FR.UTF8');

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :unsure:

 

J'ai appliquer ta recommandation en tous cas.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ;)

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

@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

Partager ce message


Lien à poster
Partager sur d’autres sites

@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)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×