Aller au contenu
Création de sites web en éco-conception

16/04/2013 Une page multilingue grâce aux expressions régulières.

Pour les besoins d'une page multilingue, je manie le code HTML suivant :

$html="<head> <title><language> <fr>Bienvenue</fr> <en>Welcome</en> <de>Willkommen</de> </language></title> </head>";

Il contient ce que j'appelle des "pseudo-balises", utilisées uniquement pour filtrer la page avant de l'afficher, suivant la langue choisie. Dans le cas de l'anglais ("en"), il faut supprimer le contenu des pseudo-balises "fr" et "de" (et évidemment supprimer toutes les pseudo-balises). Un petit coup de regex et ça donne :

<head> <title> Welcome </title> </head>

Pas très propre... mais surtout, la présence de retours à la ligne dans une balise title peut elle être préjudiciable quant au référencement de la page ? Il y a peu de risques... mais dans le doute... Voilà le code PHP pour afficher correctement la page HTML :

1. définitions des variables :

// toutes les langues $langues=["fr","en","de"]; // langue choisie cf http://www.example.com/?lang=en $langue_choisie=$_GET["lang"]; // réduction du tableau de langues (la langue choisie n'y figurera plus) unset($langues[array_search($langue_choisie,$langues)]);

2. Suppression des langues non choisies (pseudo-balise + contenu) :

$html=preg_replace( "#<(".implode("|",$langues).")>(.*)</(".implode("|",$langues).")>#", "", $html );

3. suppression des pseudo-balises "language"

$html=preg_replace("#<language>([^<]+)<#s","<",$html); $html=preg_replace("#>([^<]+)</language>#s",">",$html);

Le caractère "s" qui suit le délimiteur final est une option de recherche des expressions rationnelles nommée "dotall" (soudure de dot "point" et all "tout"). Sans elle, la recherche ne prendrait pas en compte les retours chariot :

<language> <

serait trouvée mais pas

<language> <

4. Suppression des pseudo-balises de la langue choisie :

$html=preg_replace( "#<".$langue_choisie.">(.*)</".$langue_choisie.">#", "$1", $html );

On obtient bien :

<head> <title>Welcome</title> </head>

Commentaires

Ajouter un commentaire :