Aller au contenu

Transformer un texte en url


Aller à la solution Solutionné par SStephane,

Sujets conseillés

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

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.

  • 1 month later...
Posté

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 ?

  • 10 months later...
Posté

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.

Posté

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

  • 1 year later...
  • Solution
Posté

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

Posté

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.

  • 2 years later...
Posté

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.


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

Posté

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

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

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.

Posté

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

setlocale(LC_CTYPE, 'fr_FR');

 

Posté

Que donnent les variables $LANG et $LC_ALL ?

 

J'aurais plutôt tendance à utiliser

setlocale(LC_ALL, 'fr_FR.UTF8');

 

Posté

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.

Posté

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

 

 

Posté

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

 

Veuillez vous connecter pour commenter

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



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