Jonathan Petitcolas

Geek et passionné de high-tech…

Convertir une phrase pour l'URL Rewriting en PHP

Cela faisait bien longtemps qu'il n'y avait pas eu d'article technique. Voici donc une petite fonction bien utile afin de transformer, un peu à la WordPress, une phrase en un lien optimisé pour le référencement. Par exemple, on peut transformer la phrase :

Télécharger le bulletin d'adhésion à notre association

En :

telecharger-bulletin-adhesion-notre-association

On aura alors gardé les mots-clefs essentiels, tout en supprimant les caractères spéciaux qui pourraient poser problème dans les navigateurs. Très utile pour l'URL Rewriting, cela vous permettra d'optimiser simplement votre référencement. Abusez-en, c'est gratuit ! :p

/**
 * Convert into filename by removing all accents and special characters. Useful for URL Rewriting.
 * @param $text
 * @return string
 */
public function ConvertIntoFilename($text)
{
	// Remove all accents.
	$convertedCharacters = array(
		"À" => "A", "Á" => "A", "Â" => "A", "Ã" => "A", "Ä" => "A", "Å" => "A",
		"à" => "a", "á" => "a", "â" => "a", "ã" => "a", "ä" => "a", "å" => "a",
		"Ò" => "O", "Ó" => "O", "Ô" => "O", "Õ" => "O", "Ö" => "O", "Ø" => "O",
		"ò" => "o", "ó" => "o", "ô" => "o", "õ" => "o", "ö" => "o", "ø" => "o",
		"È" => "E", "É" => "E", "Ê" => "E", "Ë" => "E",
		"é" => "e", "è" => "e", "ê" => "e", "ë" => "e",
		"Ç" => "C", "ç" => "c",
		"Ì" => "I", "Í" => "I", "Î" => "I", "Ï" => "I",
		"ì" => "i", "í" => "i", "î" => "i", "ï" => "i",
		"Ù" => "U", "Ú" => "U", "Û" => "U", "Ü" => "U",
		"ù" => "u", "ú" => "u", "û" => "u", "ü" => "u",
		"ÿ" => "y",
		"Ñ" => "N", "ñ" => "n"
	);

	$text = strtr($text, $convertedCharacters);

	// Put the text in lowercase.
	$text = mb_strtolower($text, 'utf-8');

	// Remove all special characters.
	$text = preg_replace('#[^a-z0-9\-]#', '-', $text);

	// Remove two consecutive dashes (that's not very pretty).
	$text = preg_replace('/--/U', '-', $text);

	// Remove words containing less than 2 characters (non significant for the meaning)
	$return = array();
	$text = explode('-', $text);

	foreach($text as $word)
	{
		if(mb_strlen($word, 'utf-8') <= 2)	continue;
		$return[] = $word;
	}

	return implode('-', $return);
}

Voici le processus technique, même si cela risque d'être redondant par rapport aux commentaires.

  1. On commence par supprimer tous les accents et caractères un peu litigieux (comme le c cédille) en les remplaçant par leur équivalent littéral, grâce à la fonction strtr,
  2. On met alors la phrase en minuscules, grâce à la fonction mb_strtolower. Pourquoi ne pas utiliser la fonction strtolower plus simplement ? Car celle-ci ne gère pas l'UTF-8. Il est donc bon d'avoir le réflexe mb_ pour toutes les fonctions standards de chaînes de caractères, qui possède un second argument : l'encodage de la chaîne de caractères.
  3. On supprime alors, à l'aide d'une expression régulière (pour ne pas en oublier), tous les caractères autres que les chiffres et les lettres minuscules, en les remplaçant par des tirets.
  4. Puis, on supprime tous les double-tirets consécutifs. Simple raison d'esthétisme, car ce n'est pas franchement très beau. ^^
  5. Enfin, on supprime les petits mots de deux lettres, qui n'ont que peu d'intérêt (en règle général), comme par exemple de, le, un, etc. Pour ce faire, on découpe la chaîne au niveau des tirets, et on regarde la taille, de nouveau avec une fonction mb_.
  6. Il ne nous reste alors plus qu'à retourner la chaîne reconstruite avec des tirets.

Cette fonction fait également partie du PEJO Framework, dont le site est actuellement en stand-by, étant donné le peu de temps que j'ai en ce moment. Mais il sortira bientôt... un jour... :)

Mots-clefs : , ,

13 réactions sur cet article.

  1. sirlepape dit :

    Une bien belle méthode, propre et qui gère tout les cas de figure. Je me la garde dans un coin. Merci Jonathan !

  2. ChoiZ dit :

    Bon article :) Comme d'habitude !

  3. ChoiZ dit :

    Par contre, ton serveur avance d'une heure. :P

  4. thelan dit :

    Tiens, je crois reconnaître le tableau de conversion des accents que j'avais mis dans ton Controller. =)

  5. Romain dit :

    Ya pas une histoire comme quoi il faut enregistré la page en ISO-truc plutot qu'en UTF8 pour que les caractères bizarres de l'array ne meurent pas ?

  6. @ChoiZ : Exact. C'est à présent résolu. Je ne sais pas pourquoi, mais le serveur n'a pas voulu passer en heure d'hiver. ^^

    @Romain : Effectivement. Personellement (et j'invite tout le monde à en faire autant pour des questions de pérennité) : j'utilise toujours l'UTF-8 pour mes pages. Si tu mets de l'ISO-8859-15 (aussi appelé ANSI), il va mal interpréter les différents caractères, et donc te donner des symboles étranges. Il faut donc veiller à ce point, en effet. :)

  7. ChoiZ dit :

    @Jonathan : Etrange mon commentaire d'hier n'est pas passé de 12h08 à 11h08 ça aurait du être le cas non ? :)
    Sinon l'enregistrement de ta date ne prend pas en compte le fuseau horaire ce qui n'est pas bien.

    Toujours enregistrer l'heure avec le fuseau de Greenwich et ensuite appliquer le décalage héhé ;)

  8. Tyuce dit :

    Intéressante cette fonction. Par contre, question bête, mais comment l'intégrer aux règles d'URL Rewriting rentré dans le .htaccess ?

  9. @Tyuce : Tu ne peux pas l'intégrer tel quel dans tes règles d'URL Rewriting. Mais, prenons par exemple le cas d'un module d'actualités. Pour optimiser le référencement, il faut mettre un maximum de mots-clefs dans l'URL.

    On peut choisir comme structure de base la structure suivante :

    /actualites/titre-mon-actualite-1/

    Ainsi, la fonction ci-dessus servira pour la conversion du titre. Quant au chiffre final, il s'agira de l'ID de la news à afficher. Le .htaccess correspondant sera donc :

    RewriteRule     ^actualites/([a-z0-9\-]+)\-(\d+)/?$     actualite.php?id=$2 [L]

    Ainsi, le script actualite.php sera appelé avec les URLs optimisées.

  10. Tyuce dit :

    Dans mon cas, j'ai un petit souci, car mon ID est le titre de l'article lui-même. C'est pour ça que je ne voyais pas, en enlevant certains mots dans l'URL, comment il allait faire le lien avec l'article.

    J'avais fait ça pour justement avoir une URL encore "plus propre" sans aucun numéro, au cas ou cela pénalise le référencement, mais maintenant je me retrouve un peu bloqué avec ce système. Je pense donc que je vais reprendre lle tien.

    Donc si je comprend bien, ta fonction doit être exécutée par la page d'accueil contenant les liens vers les différents articles. Elle devra lire la base de données, réécrire chaque lien avec /actualites/ConvertIntoFilename(nom de l'article)-idArticle/. J'ai bon m'sieur ? :)

  11. @Tyuce : Ouch ! Mettre en ID une chaîne de caractères est une très mauvaise pratique. Il est beaucoup plus simple, beaucoup plus rapide, et beaucoup plus efficace de mettre un entier pour la clef primaire, et pour cause : la base peut alors procéder par dichotomie. ;)

    Quant au référencement, un numéro n'a que très peu d'impact. Je trouve personellement que le choix similaire de WordPress d'enregistrer en base les URL Rewriting (donc sans numéro) est très lourd. Si j'avais le courage (et surtout du temps), je regarderai pour insérer l'ID dans l'URL, et virer les recherches de correspondance en base. On économiserait une requête par page. Si une bonne âme veut faire un plug-in dessus... ;)

    Sinon, tu as bien compris le process concernant les actualités. A toi de jouer maintenant !

  12. Tyuce dit :

    Au commencement, je n'avais pas pensé à ça et l'hébergeur (gratuit) ne proposait pas d'URL Rewriting. Du coup, j'avais décidé de mettre les titres dans l'URL en pensant que ça serait un plus pour le référencement. Mauvais choix en effet, car ça me pose pas mal de problèmes maintenant.

    Je ne savais pas que WordPress fonctionnait comme ça : il a une base de correspondance entre "convertir-une-phrase-pour-lurl-rewriting-en-php" (qu'il a réécrit par rapport au titre de ton article) et l'ID de l'article. Mais bon faire un plugin juste pour ça, faut être motivé ou vraiment être à une requête près.

    En tout cas merci Jonathan d'avoir pris le temps de me répondre. ;)

  13. Pas mal ce petit générateur de slug, bien mieux et bien plus clair que celui que j'ai mis en place la dernière fois sur une application avec pleins d'expressions régulières de tous les cotés !

    Script indispensable pour développer une application Web SEO Friendly. :)

    Merci beaucoup pour ce script !

Réagissez sur cet article !