IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Besoin d'aide pour construire une regex complexe [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 37
    Points : 19
    Points
    19
    Par défaut Besoin d'aide pour construire une regex complexe
    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&region=$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é:
    1. recherche/viager_test.htm
    2. recherche/viager_test_rente-0-9.htm
    3. recherche/viager_test_bouquet-0-9.htm
    4. recherche/viager_test_bouquet-0-9_rente-0-9.htm
    5. recherche/test/viager_test_bouquet-0-9_rente-0-9.htm
    6. recherche/test/test_test_bouquet-0-9_rente-0-9.htm
    7. 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
    1. ""."viager"."test".""."".""
    2. ""."viager"."test".""."0-9".""
    3. ""."viager"."test"."0-9"."".""
    4. ""."viager"."test"."0-9"."0-9".""
    5. "test"."viager"."test"."0-9"."0-9".""
    6. "test"."test"."test"."0-9"."0-9".""
    7. "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
    &region=$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
    &region=$1
    &type=$2
    &search=$3
    &plus=$4
    &bouquet=$5
    &rente=$6
    &p2=$7

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2004
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2004
    Messages : 108
    Points : 175
    Points
    175
    Par défaut
    Bonjour ,

    Il me semble que tu utilises donc l'url rewriting d'apache et donc que tu te complique la vie .
    Tu n'es pas obligé de faire ce regex de la mort, je ne sais pas si tu connais les flags mais le Flag [L] à mettre à la fin de tes lignes devraient suffire.
    Le principe de ce flag est d'indiquer à apache que si le regex s'applique alors on ne passera pas à la règle suivante (Last).

    Donc tu vas faire toute tes possibilité une par une en partant de celle qui a le plus de données à rattraper afin d'éviter de rentrer en collision avec celles qui ont en le moins (on ne sait jamais ).

    Et tu ajoute [L] à chaque fin de règle.

    Et voilà, plusieurs règles mais beaucoup plus clair .
    J'espère que je ne t'induis pas en erreur et que c'est ce que tu recherchais .

    Et voici en prime : http://httpd.apache.org/docs/2.2/fr/rewrite/flags.html (rien ne vaut une bonne doc )

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 37
    Points : 19
    Points
    19
    Par défaut
    Merci bien, mais avant je pratiquais la méthode que tu as cité et le site n'en devenait que de plus en plus long à répondre. Le htaccess n'étant pas interprété à la même vitesse que le php puisqu'il s'agit de directives envoyées à apache avant chargement d'une quelconque page, donc plus le htaccess et volumineux et plus les visiteurs le ressentiront.

    D'ou cette complication volontaire destinée à diminuer le temps de réponse de mes pages pour mes visiteurs.

    La règle que j'ai faite fonctionne d'ailleurs sans conflits, exactement ce que j'attendais.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Besoin d'aide pour écrire une regex
    Par kao98 dans le forum Général Python
    Réponses: 4
    Dernier message: 05/03/2010, 15h59
  2. besoin d'aide pour optimiser une requête
    Par jisse dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2006, 09h41
  3. Besoin d'aide pour afficher une image dans un applet
    Par argon dans le forum AWT/Swing
    Réponses: 16
    Dernier message: 19/01/2006, 19h45
  4. Aide pour écrire une requête complexe
    Par julienbdx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/11/2005, 16h58
  5. besoin d'aide pour intégrer une entité dans un MCD
    Par barkleyfr dans le forum Schéma
    Réponses: 17
    Dernier message: 13/10/2005, 13h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo