URL Rewriting et plusieurs id à la suite

WRInaute discret
Bonjour,

Je but sur une règle dont voici le topo:

Code:
RewriteRule ^([^/]+)t([-]?[0-9]+)[b]([0-9]+)([0-9]+)[/b]\.html	
/index.php?articles=news&catid=$3&subcatid=$4&cityid=$2 [QSA]

catid et subcatid peuvent prendre 1 ou 2 chiffre max.

Le problème viens dés deux dernières parenthèses qui sont mal interpréter.

Code:
# catid =4 et subcatid = 2 et cityid = 9
si url http://localhost/articles-vetements-t942.html ça fonctionne

mais si je fait

Code:
# catid =4 et subcatid = 27 et cityid = 9
si url http://localhost/articles-vetements-t9427.html ça ne marche pas

Je précise que je souhaite pas séparer les id (catid/subcatid) par des tirets ou slash etc ...

Merci d'avance pour votre aide ;)
 
WRInaute discret
Salut

Je connais pas assès bien l'url rewriting pour te répondre, mais y'a une autre solution au problème :

Si tu passe une seul variable numérique et ensuite, tu tritures la variable en PHP pour resortir les bonnes variables.

Genre (exemple rapide sans test hein...) : (tu peux faire
Code:
RewriteRule ^([^/]+)t([-]?[0-9]+)\.html 
/index.php?articles=news&params=2 [QSA]

Code:
$catid = 0;
$subcatid = 0;
$cityid = 0;

$test = $_GET['params'];
$catid = substr($test, 0, 2);
$subcatid = substr($test, 2, 4);
$cityid = substr($test, 4, 6);

Juste une idée :)
Faudra adapter un peux à tes besoins, mais c'est un fonctionnement qui peux être envisagé.
De plus, si tu change l'ordre, suffit de modifier le script qui triture la variable params, le reste sera ok.

Pense aussi à faire un truc par defaut, genre : /articles-vetement-000000.html
De cette façon, tu peux aussi enlever la condition.

Bon, ça répond pas à ta question ceci dit ^^
Sky
 
WRInaute discret
Dsl mat... pour les balises ;)

sky merci pour ton aide, substr permet retourner un segment de chaîne donc id mais ne gère pas les possibilités 1 ou 2 chiffres dans id comme le ferait une regexp (htaccess ou php) :? A moins que je me trompe

Sinon pour revenir à ma règles j'ai essayer ceci

Code:
([0-9]{1,2})
([0-9]{1,2}) Autorise un ou deux chiffres

Code:
RewriteRule ^([^/]+)t([-]?[0-9]+)[b]([0-9]{1,2})([0-9]{1,2})[/b]\.html

Mais ca ne marche pas, enfaite il me délimite mal id catid de subcatid, par contre si je mets un caractère entre les deux alors cela fonctionne, exemple avec (s)

Code:
RewriteRule ^([^/]+)t([-]?[0-9]+)[b]([0-9]+)s([0-9]+)[/b]\.html

mais comme dit précédemment je préfère éviter tout caractère :cry:
 
WRInaute discret
Salut
Si tu utilises des 0 quand y'a pas de nb, ça marchera.

Exemple avec aucun id : /articles-vetement-000000.html
Exemple avec un le 1er id : /articles-vetement-010000.html
Exemple avec le 2nd id, mais sans le 1er : /articles-vetement-002900.html
Exemple avec le 2nd id et le 3ème, mais sans le 1er : /articles-vetement-002982.html
Exemple avec un seul nombre a chaque id : /articles-vetement-050601.html

Si y'a qu'un chiffre, tu met un 0 devant.

Si tu conçoit une bonne fonction ou classe pour extraire tes valeurs, c'est assès simple comme fonctionnement.

Mais ceci est tjrs parce que je n'utilise plus d'url rewritng complexe depuis un bon moment ^^

Sky
 
WRInaute discret
En faite je le fait déjà un exemple

Code:
$catid?$catid:0
$subcatid?$subcatid:0

la règle délimite bien catid de subcatid si subcatid contient un seul chiffre mais pas si contient 2 chiffre

Pour l'instant je suis obliger de mettre un caractère entre les deux (un s) mais j'aimerais m'en passer :cry:
 
WRInaute discret
Tu n'as pas compris ce que j'ai dit, ou je me suis mal exprimé.

Ce que je t'ai montré, fonctionne très bien. Avec 1 ou 2 chiffres.

Il faut juste prévoir le bon nombre de 0.

Sky
 
WRInaute discret
Voici un exemple fonctionnel :
Code:
<?php
function string2ids($uri_params)
{
    $valeurs = array(
        'catid' => 0,
        'subcatid' => 0,
        'cityid' => 0
    );

    if(strlen($uri_params) == 6)
    {
        $valeurs['catid'] = (int)substr($uri_params, 0, 2);
        $valeurs['subcatid'] = (int)substr($uri_params, 2, 2);
        $valeurs['cityid'] = (int)substr($uri_params, 4, 2);
    }

    return $valeurs;
}


$params = (!isset($_GET['params']))? 0 : (string)$_GET['params'];

$mesIDS = string2ids($params);

echo '
<p>
    catid : '.$mesIDS['catid'].'<br />
    subcatid : '.$mesIDS['subcatid'].'<br />
    cityid : '.$mesIDS['cityid'].'
</p>';
?>

Bon, dit moi si je persiste dans une voie qui ne te plais pas ^^
 
WRInaute discret
Re,

Merci pour ton aide, tes efforts. En faite j'avais pas bien saisie ton raisonnement mais c'est plus clair.

Cependant cette méthode est bien à implémenter à la construction des pages, je doit fait modifier plusieurs page (60) est je t'avoue ne pas avoir le courage.

Sinon j'ai résolu mon problème en faisant comme ceci :

une règle pour un id de 1 chiffre et une autre pour un id de 2 chiffres puis c'est tout ;)

Code:
RewriteRule ^([^/]+)t([-]?[0-9]+)[b]([0-9]+)([0-9]{2})[/b]\.html   
/index.php?articles=news&catid=$3&subcatid=$4&cityid=$2 [QSA]

RewriteRule ^([^/]+)t([-]?[0-9]+)[b]([0-9]+)([0-9]{1})[/b]\.html   
/index.php?articles=news&catid=$3&subcatid=$4&cityid=$2 [QSA]

petit mémo à retenir:

Liste des quantifieurs :

"Zéro ou une fois" : point d'interrogation ?
"Zéro, une ou plusieurs fois" : étoile *
"Au moins une fois" : signe plus +
"Deux fois" : {2}
"De deux à quatre fois" : {2,4}
"Au moins deux fois" : {2,}

À noter que :

? est équivalent à {0,1}
* est équivalent à {0,}
+ est équivalent à {1,}


Merci encore pour ton aide ;)
 

➡️ 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