Rewriting probleme accent sur certains URL avec format_url

Forum consacré à phpBB2. Comment tirer le meilleur de ce puissant forum.

Modérateur: Modérateurs

Rewriting probleme accent sur certains URL avec format_url

Messagede freezbee » Lun Fév 18, 2008 4:36 pm

Bonjour,

Bon voilà j'ai presque terminé le rewriting de l'agrégateur RSS dont j'en ai parlé ICI

Et je l'ai mis en ligne : http://www.unicornis.org/rss-actualites-news.html

Il me manque plus qu'à supprimer les liens vers les pages .php, les duplicates donc.

Sinon voici mon problème pour le moment :

J'ai certains accents qui passent mal à la fonction format_url de phpBBSEO

Code: Tout sélectionner
   1. function format_url( $url, $type = 'topic' ) {
   2.  $url = strip_tags($url);
   3.  $url = htmlentities($url, ENT_COMPAT, $this->encoding);
   4.  $url = preg_replace( "`&([a-z])(acute|uml|circ|grave|ring|cedil|slash|tilde|caron|lig);`i","\\1", $url );
   5.  $url = preg_replace('`&(amp;)?#?[a-z0-9]+;`i','-',$url);
   6.  $url = preg_replace( array("`[^a-z0-9]`i","`[-]+`" ) , "-", $url);
   7.  $url = ( $url == "" ) ? $type : strtolower(trim($url, '-'));
   8.  return $url;
   9. }


exemple :

- Le titre :
Une édition spéciale pour The Witcher
- l'URL :
http://www.unicornis.org/une-dition-sp- ... -n344.html


Et d'autres qui passent très bien, toujours sur la même page :
- Le titre :
Arecibo découvre le premier système triple d'astéroïdes
- l'URL :
http://www.unicornis.org/arecibo-decouv ... -n345.html


Voici le code qui crée ces liens :

Code: Tout sélectionner
       $news_url = $phpbb_seo->format_url(smart_utf8_decode($val["titre"])).'-n'.$val["ID"].'.html';
         echo "class=a href='".$news_url;
         } else {
            // si c'est un news à description sélectionnée, stabilote
            if(@$_GET["news"]==$val["ID"]) echo "class=stabilo ";
            // lien vers le site
            echo "target='_blank' href='".$val["lien"];
         }      
         echo "'>".smart_utf8_decode($val["titre"])."</A>
            <i>[".$val["titre2"]."]</i>


Alors ça doit être une histoire d'encodage des caractères, suivant l'encodage des flux RSS. Mais bon tout s'affiche comme il faut dans le texte et les titres de page aussi. Il n'y a que les urls avec le titre injecté (passé sous format_url de phpBB SEO) qui bug...



Et pour les duplicates, comment je peux faire ? J'ai le Zero Duplicate d'installé sur le phpBB déjà comment appliquer le Zero Duplicate ici ?


Merci d'avance pour votre aide.
Dernière édition par freezbee le Mar Fév 19, 2008 5:52 am, édité 2 fois.
freezbee
PR0
PR0
 
Messages: 69
Inscription: Lun Déc 10, 2007 3:20 pm

Publicité

Messagede freezbee » Mar Fév 19, 2008 5:51 am

Dans le deuxième exemple d'URL que j'ai mis les accents et tilde (é,è,',é,¨,) sont bien remplacés.

Seul certains, provenant de certains Flux RSS ne passe pas bien au format_url.

Et comme je le dis je pense à un problème d'encodage, suivant l'encodage de caractère de certains Flux.

En fait ce sont les Flux RSS de clubic qui passent mal (les titres injectés dans l'URL).
Le flux RSS de futura-science est encodé en UTF-8
celui de PC-Inpact en ISO-8859-1
Et celui de Clubic en ISO-8859-1 je crois ??? Puisque si j'enlève la fonction smart_utf8_decode ça passe bien...

Ce qui est bizarre c'est que les accents sont bien affichés sur la page. C'est seulement dans l'url que ça ne passe pas.
freezbee
PR0
PR0
 
Messages: 69
Inscription: Lun Déc 10, 2007 3:20 pm

Messagede SeO » Mar Fév 19, 2008 10:22 am

Donc tout d'abord, la méthode format_url peut tout à fait gérer l'utf-8 directement, pour les accents ayant un équivalent en entités html non numérique.

Les problèmes de char-set sont plutôt délicats à bien gérer dans le cas général.

Dans ton cas, tu pourrais dans un premier temps te contenter de faire le trie entre l'utf8 et L'iso-8859-1.

Code: Tout sélectionner
// http://www.php.net/mb_detect_encoding
function is_utf8($string) {
        return preg_match('%(?:
        [\xC2-\xDF][\x80-\xBF]        # non-overlong 2-byte
        |\xE0[\xA0-\xBF][\x80-\xBF]               # excluding overlongs
        |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}      # straight 3-byte
        |\xED[\x80-\x9F][\x80-\xBF]               # excluding surrogates
        |\xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
        |[\xF1-\xF3][\x80-\xBF]{3}                  # planes 4-15
        |\xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
        )+%xs', $string);
}


Pourrait de servir à tester si l'utf8 est utilisé, pour ensuite configurer le char set de la classe phpbb_seo :
Code: Tout sélectionner
$phpbb_seo->encoding = "iso-8859-1";


ou :
Code: Tout sélectionner
$phpbb_seo->encoding = "utf-8";


Juste avant l'appel à format_url, en remettant :
Code: Tout sélectionner
$phpbb_seo->encoding = "iso-8859-1";

après pour ne pas perturbé le reste du processus (une fois que tu en as finit avec un flux utf8).

C'est certainement beaucoup plus rapide que smart_utf8_decode.
SeO
Admin
Admin
 
Messages: 6333
Inscription: Mer Mar 15, 2006 9:41 pm

Messagede freezbee » Mar Fév 19, 2008 11:59 am

Merci SeO.

Ca ne fonctionne toujours pas par contre.

Voilà ce que j'ai fait :

Code: Tout sélectionner
       if (is_utf8($val["titre"])) {
       $phpbb_seo->encoding = "utf-8";
       } else {
       $phpbb_seo->encoding = "iso-8859-1";
       }
       $news_url = $phpbb_seo->format_url($val["titre"]).'-n'.$val["ID"].'.html';
       $phpbb_seo->encoding = "iso-8859-1";



Et le résultat est exactement le même :
Les Flux RSS de Clubic : les titres s'affichent bien (accent et tout), mais le titre injecté dans l'url se retrouve avec les accents remplacés par des tirets -
freezbee
PR0
PR0
 
Messages: 69
Inscription: Lun Déc 10, 2007 3:20 pm

Messagede SeO » Mar Fév 19, 2008 12:08 pm

Tu utilises bien la dernière version (0.2.4) ?
SeO
Admin
Admin
 
Messages: 6333
Inscription: Mer Mar 15, 2006 9:41 pm

Messagede freezbee » Mar Fév 19, 2008 12:12 pm

Oui j'ai tout en dernière version pour phpBB2 :

rapport de vérification de version par XS a écrit:phpBB SEO Advanced mod rewrite MOD 0.2.4 Dernière version utilisée.
phpBB SEO Advanced Zero Duplicate MOD 0.2.2 Dernière version utilisée.
phpBB SEO Dynamic meta tags MOD 0.2.0 Dernière version utilisée.
META TAGS phpBB Annuaire MOD 0.2.0 Dernière version utilisée.
phpBB SEO mx Sitemaps MOD 0.2.2 Dernière version utilisée.
phpBB SEO Optimal Titles MOD 1.0.0 Dernière version utilisée.
SEO URL Simple Subforums MOD 0.2.2 Dernière version utilisée.
SEO URL phpBB Annuaire MOD 0.2.0 Dernière version utilisée.
phpBB SEO Simple Show Bots MOD 0.0.2 Dernière version utilisée.
freezbee
PR0
PR0
 
Messages: 69
Inscription: Lun Déc 10, 2007 3:20 pm

Messagede freezbee » Mar Fév 19, 2008 12:23 pm

Par contre, j'ai déjà mis le code format_url dans le premier post, mais par rapport à l'original de la version .0.2.4 il a était modifié comme ceci :

Code: Tout sélectionner
   
function format_url( $url, $type = 'topic' ) {
      $url = strip_tags($url);
      $url = htmlentities($url, ENT_COMPAT, $this->encoding);
      $url = preg_replace( "`&([a-z])(acute|uml|circ|grave|ring|cedil|slash|tilde|caron|lig);`i","\\1", $url );
      $url = preg_replace('`&(amp;)?#?[a-z0-9]+;`i','-',$url);
      $url = preg_replace( array("`[^a-z0-9]`i","`[-]+`") , "-", $url);
      $url = ( $url == "" ) ? $type : strtolower(trim($url, '-'));
      return $url;
   }


Suite à ce topic : [Réglé] Caractères spéciaux - exotiques
freezbee
PR0
PR0
 
Messages: 69
Inscription: Lun Déc 10, 2007 3:20 pm

Messagede SeO » Mar Fév 19, 2008 12:24 pm

Bizarre.

Le problème doit être que les é des flux qui ne marchent pas ne sont pas tout à fait bien formés, ou alors qu'ils sont sous la forme d'entités html numériques, tu as vérifié la source du flux qui pose problème ?

A tout hasards, essais avec utf8_decode() pour tout le monde, en ne touchant pas à $phpbb_seo->encoding, mais je doute.
SeO
Admin
Admin
 
Messages: 6333
Inscription: Mer Mar 15, 2006 9:41 pm

Messagede freezbee » Mar Fév 19, 2008 12:29 pm

SeO a écrit:A tout hasards, essais avec utf8_decode() pour tout le monde, en ne touchant pas à $phpbb_seo->encoding, mais je doute.


Oui j'ai déjà essayé, mais ce n'est pas mieux, pire même, que la fonction smart_utf8_decode que voici :

Code: Tout sélectionner
// utf8_decode déconne parfois :s
function smart_utf8_decode($in_str) {

   
   // Replace ? with a unique string
   $new_str = str_replace("?", "q0u0e0s0t0i0o0n", $in_str);
   // Try the utf8_decode
   $new_str=utf8_decode($new_str);
   // if it contains ? marks
   if (strpos($new_str,"?") !== false) {
      // Something went wrong, set new_str to the original string.
      $new_str=$in_str;
   } else {
      // If not then all is well, put the ?-marks back where is belongs
      $new_str = str_replace("q0u0e0s0t0i0o0n", "?", $new_str);
   }
   $new_str = str_replace("&apos;","'",$new_str); // RC t'es chiant :)

   return $new_str;
}
freezbee
PR0
PR0
 
Messages: 69
Inscription: Lun Déc 10, 2007 3:20 pm

Messagede freezbee » Mar Fév 19, 2008 12:59 pm

Je viens d'essayer une autre fonction :

Code: Tout sélectionner
function encodeToIso($string) {
     return mb_convert_encoding($string, "ISO-8859-1", mb_detect_encoding($string, "UTF-8, ISO-8859-1, ISO-8859-15", true));
}



Code: Tout sélectionner
         $titre_url= encodeToIso($val["titre"]);
       $news_url = $phpbb_seo->format_url($titre_url).'-n'.$val["ID"].'.html';



Et c'est toujours la même chose.
Les Flux RSS de Clubic : les titres s'affichent bien (accents et tout), mais le titre injecté dans l'url se retrouve avec les accents remplacés par des tirets -
Voici le flux en question : http://www.clubic.com/xml/news.xml
freezbee
PR0
PR0
 
Messages: 69
Inscription: Lun Déc 10, 2007 3:20 pm

Messagede freezbee » Mar Fév 19, 2008 1:26 pm

SeO a écrit: ou alors qu'ils sont sous la forme d'entités html numériques, tu as vérifié la source du flux qui pose problème ?


Voilà un exemple d'un titre de la source du Flux :
Code: Tout sélectionner
Microsoft : des outils de d&#233 ;veloppement gratuits

Edit : j'ai mis un espace entre 233 et ; car sinon ça convertit automatiquement en é.


C'est ça peut être la forme d'entités html numériques ?

Comment faire dans ce cas là ?

Merci.
freezbee
PR0
PR0
 
Messages: 69
Inscription: Lun Déc 10, 2007 3:20 pm

Messagede freezbee » Mar Fév 19, 2008 2:08 pm

Bon bah voilà j'ai trouvé en cherchant des fonctions :

Code: Tout sélectionner
function numericentitieshtml($str){
  return preg_replace('/&#(\d+);/e', 'chr(str_replace(";","",str_replace("&#","","$0")))', $str);
}


Code: Tout sélectionner
$titre_url= smart_utf8_decode($val["titre"]);
$titre_url = numericentitieshtml($titre_url);
$news_url = $phpbb_seo->format_url($titre_url).'-n'.$val["ID"].'.html';


Ceci marche parfaitement : http://www.unicornis.org/rss-actualites-news.html

:D Merci.
freezbee
PR0
PR0
 
Messages: 69
Inscription: Lun Déc 10, 2007 3:20 pm

Messagede freezbee » Mar Fév 19, 2008 2:12 pm

Ah oui et maintenant comment puis-je appliquer le Zero Duplicate à tout ça ?
freezbee
PR0
PR0
 
Messages: 69
Inscription: Lun Déc 10, 2007 3:20 pm

Messagede SeO » Jeu Fév 21, 2008 9:59 am

Et bien, de la même façon que pour phpBB, tu compare l'uri avec l'url que tu es censé avoir, dans ton cas, il n'y a pas l'air d'y avoir de variable en plus, donc, il te suffit de 1) construire l'url complète et de la comparer avec l'uri complète (+ domaine pour être sûr).

Regardes comment c'est fait sur phpBB ;)
SeO
Admin
Admin
 
Messages: 6333
Inscription: Mer Mar 15, 2006 9:41 pm

Messagede freezbee » Jeu Fév 21, 2008 10:04 am

SeO a écrit:Et bien, de la même façon que pour phpBB, tu compare l'uri avec l'url que tu es censé avoir, dans ton cas, il n'y a pas l'air d'y avoir de variable en plus, donc, il te suffit de 1) construire l'url complète et de la comparer avec l'uri complète (+ domaine pour être sûr).

Regardes comment c'est fait sur phpBB ;)


J'ai regardé les codes de Zero duplicate sous phpBB, ainsi que celui pour l'annuaire Genova (qui a l'air plus court et simple). Mais je n'ai rien compris. :cry:

Merci
freezbee
PR0
PR0
 
Messages: 69
Inscription: Lun Déc 10, 2007 3:20 pm

Suivante

Retourner vers Le Forum phpBB2

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 34 invités