Bonjour,
Tout d'abord je m'excuse si je poste dans le mauvais forum car ma regex est sous HTACCESS et non php directement.
N'ayant pas trouvé de forum traitant sur les regex htaccess et partant du principe que les regex fonctionnent quasiment de la même manière sur n'importe quel langage, j'ai donc posté ici.
Mon problème est le suivant, je dois construire une regex avec beaucoup d'arguments facultatifs, comment puis-je procéder avec les conditions que je vais vous énoncer ?
Si vous ne connaissez pas le htaccess mais que vous pratiquez bien les regex php, considérez que le schema ci-dessous est équivalent à un preg_replace.
Mon pattern actuel:
^recherche([a-z/-]*)/([a-z-]*|viager)([a-z0-9_-]*)_bouquet-([0-9]+-[0-9]+)_rente-([0-9]+-[0-9]+)-p([0-9]+)\.htm$
Mon replace:
/?p=recherche®ion=$1&type=$2&search=$3&bouquet=$4&rente=$5&p2=$6
Comme vous pouvez le constater j'ai 6 variables à récupérer.
region = $1
type = $2
search = $3
bouquet = $4
rente = $5
p2 = $6
Je souhaiterais que chacune de ses variables deviennent facultatif, hors je n'ai réussi que pour $1, $2 et $3.
Je n'arrive pas à faire en sorte que $4, $5 et $6 deviennent facultatifs sans créer des conflits dans mon replace.
J'ai donc pour l'instant plusieurs regex à la chaine, ce qui est vraiment loin d'être propre et devient vite lourd pour les requêtes http.
Je recherche donc un pattern qui ressemblerait à ceci: ^recherche(/[a-z-]*)/([a-z-]*|viager)(_[a-z0-9-]*)(_bouquet-([0-9]+-[0-9]+))(_rente-([0-9]+-[0-9]+))(-p([0-9]+))\.htm$
et qui rendrais donc chaque parenthèses facultatives mais devant commencer obligatoirement par leur premier caractère. (en général _, / ou -)
ainsi une chaine de caractères tel que celles citées ci-après, serait convenablement traité:
- recherche/viager_test.htm
- recherche/viager_test_rente-0-9.htm
- recherche/viager_test_bouquet-0-9.htm
- recherche/viager_test_bouquet-0-9_rente-0-9.htm
- recherche/test/viager_test_bouquet-0-9_rente-0-9.htm
- recherche/test/test_test_bouquet-0-9_rente-0-9.htm
- recherche/test/test_test_bouquet-0-9_rente-0-9-p4.htm
et donneraient en résultat du replace $1.$2.$3.$4.$5.$6
- ""."viager"."test".""."".""
- ""."viager"."test".""."0-9".""
- ""."viager"."test"."0-9"."".""
- ""."viager"."test"."0-9"."0-9".""
- "test"."viager"."test"."0-9"."0-9".""
- "test"."test"."test"."0-9"."0-9".""
- "test"."test"."test"."0-9"."0-9"."4"
Si quelqu'un a une solution, je le remercie d'avance. :)
----------------------------------------------
Edit: j'ai pu résoudre seul mon problème, voici la solution pour ceux que ça intéresserait.
Pour vous faciliter la lecture, je fais volontairement des sauts de ligne sur ce post. (à retirer en production bien sur ^^)
pattern version PHP:
^recherche
(\/([a-z-]+))?
\/([a-z-]+|viager)
(_(([a-z-]+)(-([0-9]{1,5}))?))?
(_bouquet-([0-9]+-[0-9]+))?
(_rente-([0-9]+-[0-9]+))?
(-p([0-9]+))?
\.htm$
replace version PHP:
/?p=recherche
®ion=$2
&type=$3
&search=$6
&plus=$8
&bouquet=$10
&rente=$12
&p2=$14
Edit n°2: Le HTACCESS ne permet pas de dépasser plus de 9 variables, il faut donc ajouter simplement ?: au début de chaque parenthèse inutiles pour qu'elles ne soient pas prise en compte.
pattern version HTACCESS:
^recherche
(?:\/([a-z-]+))?
\/([a-z-]+|viager)
(?:_(?:([a-z-]+)(?:-([0-9]{1,5}))?))?
(?:_bouquet-([0-9]+-[0-9]+))?
(?:_rente-([0-9]+-[0-9]+))?
(?:-p([0-9]+))?
\.htm$
replace version HTACCESS:
/?p=recherche
®ion=$1
&type=$2
&search=$3
&plus=$4
&bouquet=$5
&rente=$6
&p2=$7
Partager