Url rewrite et caractére spéciaux

Nouveau WRInaute
Bonjour tout le monde,

j'espére que les fetes ont été bonne pour tout le monde :wink:

je suis nouveau sur le forum, mais je sens que je vais devenir un habitué

voila donc ma question =>

je suis en train d'effectuer de l'url rewriting sur mon site internet, tout fonctione exepté quelques petites choses.

j'utilise comme séparateur le -

et voici mes problèmes =>

* si un article est appelé alors qu'il contient un - dans son nom, IE m'affiche impossible d'afficher la page
* ensuite je n'arrive pas a supprimer les caractéres spéciaux comme ()'&%$ etc... ce qui me fait des %2B et autres dans l'url sur certain produits.

Donc comment puis je remedier a ce problème.

voici mon .htaccess en test
Code:
Options +FollowSymLinks
    RewriteEngine 	on
    RewriteBase  	/test
    RewriteRule   	admin                      - [L]
    RewriteRule   	test$            /test/index.php [R,L]
    RewriteRule   	test/$           /test/index.php [R,L]
    RewriteCond   	%{REQUEST_URI}             !-d
    RewriteCond   	%{REQUEST_URI}             !^/$
    RewriteRule   	!\.(gif|php|css|js|jpg)$      /test/rewrite.php
    RewriteRule  		.*      - [F]

ensuite voici le contenu de mon fichier rewrite.php

Code:
<?php 

 include('includes/application_top.php');
  
 if ($REQUEST_URI == '/catalog/') {
   tep_redirect(tep_href_link(FILENAME_DEFAULT));
 }

 if ($REQUEST_TYPE == 'SSL') {
   $comparison_array = explode('/', HTTPS_SERVER . DIR_WS_HTTPS_CATALOG, 4);
 } else {
   $comparison_array = explode('/', HTTP_SERVER . DIR_WS_HTTP_CATALOG, 4);
 }
 $comparison = $comparison_array[3];

 $parts = explode('?', str_replace($comparison, '', $REQUEST_URI), 2);
 $list = explode('/', preg_replace(array('#^/#', '#/$#'), '', $parts[0]));
 if (sizeof($parts) == 2) {
   $parameters = explode('&', $parts[1]);
   foreach ($parameters as $pair) {
     $pieces = explode('=', $pair);
     $HTTP_GET_VARS[$pieces[0]] = $pieces[1];
   }
 }
 $current_category_id = 0;
 $cPath_array = array();
 $count = 0;
 foreach ($list as $piece_encoded) {
   $count++;
   $piece = urldecode(preg_replace(array('/[-]/', '/%20/'), array(' ', '%2F'),$piece_encoded));
   if ($piece == 'catalog') {
     continue;
   }
   $query_string = "select cd.categories_id from categories_description cd, categories c where cd.categories_id=c.categories_id and cd.categories_name='" . tep_db_input($piece) . "' and c.parent_id='" . (int)$current_category_id . "'";
   $category_query = tep_db_query("select cd.categories_id from categories_description cd, categories c where cd.categories_id=c.categories_id and cd.categories_name like '" . tep_db_input($piece) . "' and c.parent_id='" . (int)$current_category_id . "'");
   if ($category_array = tep_db_fetch_array($category_query)) {
     $cPath_array[]= $category_array['categories_id'];
     $breadcrumb->add(mrpropre($piece), tep_href_link(FILENAME_DEFAULT, 'cPath=' . implode('_', $cPath_array)));
     $current_category_id = $category_array['categories_id'];
   } else {
     if ($current_category_id != '0') {
       $parent_where_string = " and p2c.categories_id='" . (int)$current_category_id . "'";
     } else {
       $parent_where_string = '';
     }
     $product_query = tep_db_query("select pd.products_id from products_description pd, products_to_categories p2c, products p where p.products_id = pd.products_id and p.products_status = '1' and pd.products_id=p2c.products_id and pd.products_name='" . tep_db_input($piece) . "'" . $parent_where_string);
     if ($product_array = tep_db_fetch_array($product_query)) {
       if (sizeof($cPath_array) < 1) {
         $cPath = tep_get_product_path($product_array['products_id']);
         $cPath_array = explode('_', $cPath);
         for ($i=0, $n=sizeof($cPath_array); $i<$n; $i++) {
           $categories_query = tep_db_query("select categories_name from " . TABLE_CATEGORIES_DESCRIPTION . " where categories_id = '" . (int)$cPath_array[$i] . "' and language_id = '" . (int)$languages_id . "'");
           if (tep_db_num_rows($categories_query) > 0) {
             $categories = tep_db_fetch_array($categories_query);        $breadcrumb->add($categories['categories_name'], tep_href_link(FILENAME_DEFAULT, 'cPath=' . implode('_', array_slice($cPath_array, 0, ($i+1)))));
           } else {
             break;
           }
         }
       } else {
         $cPath = implode('_', $cPath_array);
       }
       $breadcrumb->add(mrpropre($piece), tep_href_link(FILENAME_PRODUCT_INFO, 'cPath=' . $cPath . '&products_id=' . $product_array['products_id']));
       $HTTP_GET_VARS['products_id'] = $product_array['products_id'];
       $PHP_SELF_REWRITE = mrpropre(dirname($PHP_SELF)) . '/' . FILENAME_PRODUCT_INFO;
 $PHP_SELF = mrpropre($PHP_SELF_REWRITE);
       include(FILENAME_PRODUCT_INFO);
       exit();
     } else {
       $manufacturer_query = tep_db_query("select manufacturers_id from manufacturers where manufacturers_name='" . tep_db_input($piece) . "'");
       if ($manufacturer_array = tep_db_fetch_array($manufacturer_query)) {
         $breadcrumb->add(mrpropre($piece), tep_href_link(FILENAME_DEFAULT, 'cPath=' . implode('_', $cPath_array) . 'manufacturers_id=' . (int)$manufacturers_array['manufacturers_id']));
         $HTTP_GET_VARS['manufacturers_id'] = $manufacturer_array['manufacturers_id'];
         if ($count == sizeof($list)) {
           $HTTP_GET_VARS['filter_id'] = $current_category_id;
           $PHP_SELF_REWRITE = mrpropre(dirname($PHP_SELF)) . '/' . FILENAME_DEFAULT;
  $PHP_SELF = mrpropre($PHP_SELF_REWRITE);
           $cPath = implode('_', $cPath_array);
           $HTTP_GET_VARS['cPath'] = $cPath;
           include(FILENAME_DEFAULT);
           exit();
         } 
       } else {
         reset($list);
         /* tep_redirect(tep_href_link(FILENAME_ADVANCED_SEARCH_RESULT, 'keywords=' . implode('+', $list))); */
       }
     }
   }
 }
 $cPath = implode('_', $cPath_array);
 $HTTP_GET_VARS['cPath'] = $cPath;
 $PHP_SELF_REWRITE = mrpropre(dirname($PHP_SELF)) . '/' . FILENAME_DEFAULT;
 $PHP_SELF = $PHP_SELF_REWRITE;
 include(FILENAME_DEFAULT);
?>

et le fichier effectuant l'affichage html_output.php

Code:
<?php
// The HTML href link wrapper function
  function tep_href_link($page = '', $parameters = '', $connection = 'NONSSL', $add_session_id = true, $search_engine_safe = true) {
    global $request_type, $session_started, $SID;

    $separator = '?';
    if (tep_not_null($parameters)) {
      $product_name = '';
      switch ($page) {
        case FILENAME_PRODUCT_INFO:
        case FILENAME_DEFAULT:
          $manufacturer_name = '';
          $product_name = '';
          $new_parameter_list = array();
          $cPath_list = array();
          foreach (explode('&', $parameters) as $pair) {
            global $languages_id;
            $pair_array = explode('=', $pair);
            switch ($pair_array[0]) {
              case 'action':
                $link .= $page . '?' . tep_output_string($parameters);
                $separator = '&';
                break 3;
              case 'cPath':
                $parent_id = 0;
                foreach (explode('_', $pair_array[1]) as $category_id) {
                  $category_name_query = tep_db_query("select cd.categories_name from categories_description cd, categories c where cd.categories_id=c.categories_id and cd.categories_id='" . (int)$category_id . "' and cd.language_id='" . (int)$languages_id . "' and c.parent_id='" . (int)$parent_id . "'");
                  if ($category_name_array = tep_db_fetch_array($category_name_query)) {
                    $cPath_list[]= urlencode(strtolower(mrpropre($category_name_array['categories_name'])));
                    $parent_id = $category_id;
                  }
                }
                break;
              case 'products_id':
                $product_name_query = tep_db_query("select products_name from products_description where products_id='" . (int)$pair_array[1] . "' and language_id='" . (int)$languages_id . "'");
                if ($product_name_array = tep_db_fetch_array($product_name_query)) {
                  $product_name = strtolower(mrpropre($product_name_array['products_name']));
                }
                break;
              case 'manufacturers_id':
                $manufacturer_name_query = tep_db_query("select manufacturers_name from " . TABLE_MANUFACTURERS . " where manufacturers_id='" . (int)$pair_array[1] . "'");
                if ($manufacturer_array = tep_db_fetch_array($manufacturer_name_query)) {
                  $manufacturer_name = strtolower(mrpropre($manufacturer_array['manufacturers_name']));
                }
                break;
              case '':
                break;
              default:
                if (tep_not_null($pair)) $new_parameter_list[]= $pair;
            }
          }
          if (tep_not_null($manufacturer_name)) {
            $cPath_list[]= urlencode($manufacturer_name);
          }
          if (tep_not_null($product_name)) {
            $cPath_list[]= urlencode($product_name);
          }
          $separator = '?';
          $link .= preg_replace(array('/%2F/', '/[+]/'), array('%20', '-'), implode('/', $cPath_list));
          if (tep_not_null($new_parameter_list)) {
            $link .= $separator . implode('&', $new_parameter_list);
            $separator = '&';
          }
          break;
        default:
          $link .= $page . '?' . tep_output_string($parameters);
          $separator = '&';
      }
    } else {
      $link .= $page;
      $separator = '?';
    }

    if ( (SEARCH_ENGINE_FRIENDLY_URLS == 'true') && ($search_engine_safe == true) ) {
      while (strstr($link, '&&')) $link = str_replace('&&', '&', $link);

      $link = str_replace('?', '/', $link);
      $link = str_replace('&', '/', $link);
      $link = str_replace('=', '/', $link);

      $separator = '?';
    }

    if (isset($_sid)) {
      $link .= $separator . $_sid;
    }

    return $link;
  }

?>

la fonction qui j'utilise pour supprimer les caractéres accentués et celle ci

Code:
function mrpropre($chaine){
	$tofind = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ";
	$replac = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn";
	return(strtr($chaine,$tofind,$replac));
	}

Je travail depuis plusieurs jour sur ce problème mais impossible de trouver une solution. Ce qui est normal car je ne suis pas un pro du php :lol:

Donc j'attend vos avis, etc... tout ce qui puisse me faire avancé dans mon shmilblic... (excusé moi pour l'orthographe).

Merci d'avance et bonne fete de fin d'année a tous.

++
 
WRInaute occasionnel
function mrpropre! Joli ;-)
Sinon, pour supprimer les caractères spéciaux, fait une regex à partir de [^\w\-] à la fin de la fonction Mr Propre, ca supprimera tous les caractères différents de a-z, A-Z, 0-9, _ et -
ereg_replace("[^\w\-]", "", $string)
 
Nouveau WRInaute
Ok mais je fais comment

Sinon, pour supprimer les caractères spéciaux, fait une regex à partir de [^\w\-] à la fin de la fonction Mr Propre, ca supprimera tous les caractères différents de a-z, A-Z, 0-9, _ et -
ereg_replace("[^\w\-]", "", $string)

Merci pour cette réponse ultra rapide

ok je suis d'accord avec toi :D , mais je fais comment ?

++
 
WRInaute occasionnel
Tu places ca à la fin de ta fonction Mr Propre, et ca règle le problème des caractères spéciaux... Par contre, je n'ai pas vraiment saisi l'autre problème...
Donne-nous des exemples histoire de clarifier les choses... Je connais peu de monde qui va s'amuser à lire tout ton code...
 
WRInaute impliqué
Bienvenue dans ce forum,
Effectivement ton post est comment dire... bcp trop long.

Dans ce genre de cas, essaye d'isoler le pb, ou d'expliquer un minimum avant de balancer un code comme ca.

Mais c'est pas grave, l'essentiel et de trouver son bonheur ici ;)
 
Nouveau WRInaute
je fais comme cela

Code:
function mrpropre($chaine){ 
   $tofind = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ"; 
   $replac = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn"; 
   strtr($chaine,$tofind,$replac);
   return(ereg_replace("[^\w\-]", "", $chaine)); 
   }

Est ce bien cela ?

sinon pour mon autre problème, c'est que certain de mes produits ont des - dans leurs noms => exemple : produit-A
avec l'url rewriting j'ai bien l'url comme ceci => produit---A mais quand je clic sur le lien en question, le produit n'est pas trouvé.

en gros je gros qu'il considére le - du milieu comme séparateur également et non comme un caractére du produit.

sinon voici quelques exemple de mes problèmes

voici une url avec un problème de caractére
Code:
http://localhost/jeux-de-roles/dungeons%26dragons

ici dungeons&dragons => le & se transforme en %26

et ici pour mon deuxieme problème
Code:
http://localhost/jeux-de-roles/dungeons%26dragons/dieux-et-demi---dieux

ici l'article s'appelle dieux et demi-dieux donc j'ai l'url ci dessus, mais si je clic sur le lien, article introuvable.

j'espere etre assez clair.

Merci encore

++
 
Nouveau WRInaute
Pour la fonction c'est ok,

En m'aidant de ton code, et avec du code que j'avais j'ai reussi a faire quelques chose..

voici ma fonction mrpropre

Code:
function mrpropre($chaine){
$tofind = " ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ()[]'~$&%*@ç!?;,:/\^¨€{}|+-";
$replac = "-AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn---------------------E-----";
$mrpropre =(strtr($chaine,$tofind,$replac));
$mrpropre = ereg_replace("\"","-", $mrpropre);
$mrpropre = ereg_replace("[-]{2,}", "-", $mrpropre);
return $mrpropre; 
}

donc ici l'url est completement nettoyer, mais le problème étant que certain lien ne fonctionne pas (uniquement pour les produits avec des caractéres spéciaux).

bon du coup avec cette fonction

j'ai par exemple comme url ceci

http://localhost/catalog/jeux-de-roles/dungeons-dragons

donc le & est bien transformé en -.
mais comme j'utilise le - comme séparateur, il considére le - comme un séparateur et non comme un caractére du nom du produit.

j'espere que je suis assez clair...

comment je peux faire pour qu'il comprenne qu'il s'agit bien d'un caractére du produit et non du - utilisé comme séparateur.

Je pense qu'il faut faire une modification au niveau du fichier rewrite.php que je montre au debut, mais je ne sais pas par quoi commencer.

Merci encore

++
 
WRInaute impliqué
Pour les caracteres speciaux, il suffit d'utiliser la fonction utf8_decode($string) , qui est faite pour cela. Pas besoin de passer par une regex compliquée.
 
Nouveau WRInaute
Bon le problème pour nettoyer l'url est ok...

maintenant j'ai bien des urls nettoyés.

cependant comme je le dis dans mon post ci dessus.

exemple :

j'ai un produit dungeons&dragons

transformé en dungeons-dragons dans l'url

si je clic sur le lien, il ne reconnait pas le produit et j'arrive automatiquement sur la page produit non trouvé.

Donc je suppose maintenant qu'il ne reste plusqu'a faire en sorte que le caractére spéciaux une fois transformé ne soit pas considére comme le séparateur pour le rewriting mais comme le caractére d'origine.

car le problème est similaire avec les '()% ils sont bien transformé en -, mais le lien ne fonctionne pas.

Merci d'avance

++
 
Nouveau WRInaute
le php est moi ce n'est pas pour tout de suite

Bon et bien j'arrette pour aujourd'hui, faut bien que je dorme un jour. :D

je suis vert je bosse sur ce problème depuis déja plusieurs heures et je n'ai pas avancé d'un poil ! CA M'ENERVE.....

toujours ce satané problème avec les caractéres spéciaux et les - .

Si quelqu'un peux m'aiguiller, ou me donner un petit coup de pouce je serais super content.

Encore merci

++

PS : Bon nouvel an a tous ! (en avance :lol: )
 
Nouveau WRInaute
Je n'y arrive pas !

Bonjour,

aprés une bataille acharné, je n'arrive toujours pas a obtenir ce que je souhaite.

Je commence a me tiré les cheuveux ....

C'est pourquoi j'en reviens a vous tous, car j'ai sérieusement besoin d'un coup de main pour faire avancé mon opération.

toujours le même problème.

j'utilise le - comme séparateur et tout mes liens qui contiennent avant le rewrite un - a l'intérieur ne fonctionne pas

exemple : j'ai un produit => toto-titi
mon lien est toto-titi (le - du produit est interpreté comme étant un séparateur alors qu'il n'en est pas un)

et quand je clic sur le lien rien ne marche (erreur 404)
il en est de même pour les caractére spéciaux que je transforme en -

Merci d'avance

PS : j'ai supprimé tout le code inutile pour le premier post (afin de le rendre plus lisible)

++
fab
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut