Aller au contenu

Transformer un texte en url


captain_torche
Aller à la solution Solutionné par SStephane,

Sujets conseillés

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
Lien vers le commentaire
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.

Lien vers le commentaire
Partager sur d’autres sites

  • 1 month later...

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 ?

Lien vers le commentaire
Partager sur d’autres sites

  • 10 months later...

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.

Lien vers le commentaire
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 ;)

Lien vers le commentaire
Partager sur d’autres sites

  • 1 year later...
  • Solution

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

Lien vers le commentaire
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.

Lien vers le commentaire
Partager sur d’autres sites

  • 2 years later...

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.


Lien vers le commentaire
Partager sur d’autres sites

  • 1 year later...
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

Lien vers le commentaire
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
Lien vers le commentaire
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.

Lien vers le commentaire
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.

Lien vers le commentaire
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 ;)

 

 

Lien vers le commentaire
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

Lien vers le commentaire
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)

 

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...