preg_match toute simple mais blocage...

lambi521

WRInaute passionné
Bonjour à tous,

Pour rediriger mes mauvaises URLs vers mes URLs SEO, j'utilise une fonction preg_match mais je n'arrive pas à la faire fonctionner, si quelqu'un parmis vous peut m'aider :)

Mes URLs sont de la forme :
blablabla-blabla-blabla-21_52.html (réécrites)
index.php?cPath=21_52 (non réécrites)

Ce que je veux c'est identifier le dernier $category_id du cPath (après je sais redirigé en 301 vers la bonne page)

J'ai fait ceci :
Code:
preg_match("([0-9]{1,3})\_{0}", $_GET['cPath'], $matchs); ou bien
preg_match("([0-9]{1,3})[^_]", $_GET['cPath'], $matchs)
Pour trouver le dernier nombre composé de 1, 2 ou 3 chiffres dans le cPath. Et pour être sûr que c'est le dernier, j'ai testé qu'il n'y ai pas de "_" après ce chiffre, mais ça ne marche pas. Dans cet exemple je voudrais que ça me retourne "52". Il y a surement un meilleur moyen ?
 

zeb

WRInaute accro
je comprend pas bien pourquoi le preg_match.

Ta variable $_GET['cPath'] contient quoi et tu veux obtenir quoi ?
 

lambi521

WRInaute passionné
Merci pour la réponse !

Ma variable cPath contient le chemin de la catégorie courante, par exemple :
catégorie_souscatégories_sousouscatégories = 21_52_103

Moi je veux récupérer l'id de la catégorie la plus loin dans le cPath, celle vers laquelle on veut se diriger en fait. Par exemple là ça doit me retourner "103". Le problème c'est que dans mon URL si on tape un "faux" cPath, par exemple 12000_99999_103, le site affiche tout de même la catégorie 103, ce qui fait qu'il y a DC puisque plusieurs URLs !

Une fois l'id de la categ courante identifié dans le cPath, je reconstruit celui-ci comme il faut pour redirigé en 301 vers la bonne URL.

Peut-tu expliquer ta fonction ?
 

zeb

WRInaute accro
ereg_replace effectue un remplacement dans une variable par une expression de substitution via un regex.

* le regex est ici ^.*_ Litéralement c'est : depuis le début de la chaine de caractére (^), tout ce que tu trouve (.*) avant d'atteindre le caractère souligné (_)
* l'expression de substitution est une chaine vide ""
* et la variable sur laquelle ça agi est ta GET

donc au final dans l'exemple tu devrais récupérer le dernier chiffre dans $nombre.

Le problème c'est que dans mon URL si on tape un "faux" cPath, par exemple 12000_99999_103, le site affiche tout de même la catégorie 103, ce qui fait qu'il y a DC puisque plusieurs URLs !
ça c'est un autre souci.

pour que tu valide ou pas l'action il faut effectivement faire un preg match du genre :

preg_match("|[0-9]{1,3}_[0-9]{1,3}_[0-9]{1,3}$|", $_GET['cPath'], $matchs)

devrait être true si c'est ton url foireuse.
 

lambi521

WRInaute passionné
* le regex est ici ^.*_ Litéralement c'est : depuis le début de la chaine de caractére (^), tout ce que tu trouve (.*) avant d'atteindre le caractère souligné (_)

Si je comprend bien ton explication, la fonction s'arrête au "_" sauf que si mon URL est aaaaaaaaaaaaaaa-21_52_103.html, il va s'arrêter au 1er "_" et me retourner 52_103, ça n'est pas ce que je veux.

Par ailleurs j'aimerais utiliser preg_match, ma proposition dans mon 1er post doit fonctionner si quelqu'un sait comment dire "sans underscore derrière" en langage expression régulière

pour que tu valide ou pas l'action il faut effectivement faire un preg match du genre :

preg_match("|[0-9]{1,3}_[0-9]{1,3}_[0-9]{1,3}$|", $_GET['cPath'], $matchs)
Une fois que j'ai réussi à récupérer la dernier id du cPath c'est bon, je sais tester et redirigé vers la bonne URL en cas de différence à coup sûr

C'est si compliqué que ça ???
 

zeb

WRInaute accro
lambi521 a dit:
Si je comprend bien ton explication, la fonction s'arrête au "_" sauf que si mon URL est aaaaaaaaaaaaaaa-21_52_103.html, il va s'arrêter au 1er "_" et me retourner 52_103, ça n'est pas ce que je veux.

Tu as essayé au moins ? ... non ... (la je te fais les question ET les réponses) car si tu l'avais fait tu aurais vu que ça te renvoie ce que tu cherche. Bref...
Quand tu pose une question soit précis et complet le code c'est pas de l'approximatif.
Voila que tu sort un ".html" de ton chapeau pour justifier je sais pas quoi mais du coup ça renvoie pas "103" mais 103.html (logique)

lambi521 a dit:
Une fois que j'ai réussi à récupérer la dernier id du cPath c'est bon, je sais tester et redirigé vers la bonne URL en cas de différence à coup sûr
preg_match c'est surtout pratique pour tester la validité au travers d'un pattern c'est pas spécialement adapté pour transformer une donnée dans un contenu. Donc si tu veux tester la possible DC et avoir l'ID il est possible que tu doive passer par deux opérations.

lambi521 a dit:
C'est si compliqué que ça ???
ça dépend souvent de comment on pose le problème de plus il est inutile d'ouvrir 40 sujet a la suite pour le même problème.
 

Supermaury

WRInaute discret
Peut-être un début de solution (mais j'avoue je suis une quiche en PHP / Expression régulière).

Essaie ça, j'ai testé en local et ça semble fonctionner :

Code:
<?php
$subject = "index.php?cPath=222-21_33_555";
$pattern = '/[1-9]*$/i';
preg_match($pattern, $subject, $matches);
print_r($matches);
?>

@++
 

lambi521

WRInaute passionné
Tu as essayé au moins ? ... non ... (la je te fais les question ET les réponses) car si tu l'avais fait tu aurais vu que ça te renvoie ce que tu cherche. Bref...
Quand tu pose une question soit précis et complet le code c'est pas de l'approximatif.
Voila que tu sort un ".html" de ton chapeau pour justifier je sais pas quoi mais du coup ça renvoie pas "103" mais 103.html (logique)
Je ne cherche rien à justifier, la preuve le .html que tu découvres est dans le 1er post :
Code:
Mes URLs sont de la forme :
blablabla-blabla-blabla-21_52.html (réécrites)
index.php?cPath=21_52 (non réécrites)
Et d'autre par, je connais un petit peu le PHP (ironie) et je n'ai pas besoin de tester pour savoir que ta fonction ne me conviens pas étant donné qu'elle s'arrête au 1er "_" et que c'est justement le piège à éviter, d'où mon post ici.
De plus, le .html ne fait pas partie du cPatch qui est :
Ma variable cPath contient le chemin de la catégorie courante, par exemple :
catégorie_souscatégories_sousouscatégories = 21_52_103
ça dépend souvent de comment on pose le problème de plus il est inutile d'ouvrir 40 sujet a la suite pour le même problème.
C'est pour cela que j'ai rééxpliqué plus succinctement dans un 2ème topic, vu qu’apparemment j'avais mal expliqué la 1ère fois. Merci quand même pour ton aide.

Je vais tester ta solution Supermaury, je crois que c'est ce "i" que je cherchais. Je fais un retour dès que c'est OK.
 

zeb

WRInaute accro
lambi521 a dit:
Et d'autre par, je connais un petit peu le PHP (ironie) et je n'ai pas besoin de tester pour savoir que ta fonction ne me conviens pas étant donné qu'elle s'arrête au 1er "_" et que c'est justement le piège à éviter

C'est résolu donc pas de souci mais tu raconte une bêtise quand même :
^.*_
Tout jusqu'au "_" depuis le début donc jusqu'au dernier puisque "_" fait parti de "tout", ou alors le php sur mes serveurs fonctionne pas comme le tiens car moi j'ai vérifié. :wink:
 

lambi521

WRInaute passionné
@zeb exact ! Pwa désolé, je l'avais mal comprise, j'ai vraiment besoin de vacances ! En + j'ai du mal avec les expressions régulières, à part les vraiment basiques où je m'en sors mais le reste c'est la cata ! Ta fonction fonctionne sauf si il n'y a pas de "_" dans le cPath, comme dans les catégories mères, donc je garde la solution de Spout !

Au plaisir de t'aider prochainement :)
 

zeb

WRInaute accro
lambi521 a dit:
j'ai vraiment besoin de vacances !
Lol moi aussi mais c'est bientôt le cas il me semble. On va pouvoir se refaire une santé a coup de dinde au marron :wink: (en vérité j'aime pas la dinde mais bon, les repas de familles n'ont pas que du mauvais puisqu'on tape dans la cave a l'occasion)
 

Discussions similaires

Haut