Magazine

^([Rr]ege(x)+[^X]p{0,1}|Regexxxxp?)$

Publié le 15 octobre 2007 par Olivier Duval

Un ex-collègue se posait des questions concernant la meilleure manière de rédiger une expression régulière, pour une utilisation avec des règles de ré-écritures d’URL. Une regexp est tout sauf générique, une regexp du type

~/.*/.*/(.+)$ 
n’est pas suffisamment précise pour répondre sans ambiguité aux URLs suivantes :
  • http://localhost:3431/protection-solaire/capital-soleil/LPPM0001 redirection vers http://localhost:3431/product.aspx?codeProduct=LPPM0001
  • http://localhost:3431/nav/about/about.aspx sera redirigée vers l’URL précédente, mais il ne le faudrait pas.

En dehors de tout contexte, on se doit d’introduire un motif discriminant dans une regexp, afin de rendre le résultat déterministe et sans ambiguité.

Quelques exemples, regex => redirection :

/?e/a/(\d+)(/([\w\d\-\.]+)?)?$ => /reseau/accueil/default.aspx?res=$1&ccinettoken=$3

/?e/c/(\d+)(/([\w\d\-]+)?)?$ => /cciemploi/PresentationOffres/AfficheOffre.aspx?OffreId=$1&ccinettoken=$3

/?e/r/(\d+)/(\d+)(/([\w\d\-]+)?)?$ => /reseau/ressources/AfficheRessource.aspx?res=$1&ressId=$2&ccinettoken=$4

/?e/f/(\d+)/(\d+)(/([\w\d\-]+)?)?$ => /reseau/fic_action/consult.aspx?res=$1&id=$2&ccinettoken=$4

Les motifs qui rendent unique la redirection sont :

  • /e : on va dire la racine pour ce type d’URL
  • /a, /c, /r, ... : la sous-catégorie pour ce type d’URL
  • la suite, càd la regexp, représente une règle métier, autrement dit, la page de redirection avec ses paramètres pour cette catégorie et sous-catégorie de pages.

Parce qu’une regexp mal écrite peut s’avérer catastrophique, on la testera avec une liste exhaustive de cas d’utilisation.

Quelques ressources : http://del.icio.us/zorky/regex

1 avec des modules (HttpModules) du type UrlRewriter ou celui-ci. Sous Apache, le module mod_rewrite permet également de faire de belles choses.

2 les expressions régulières sont bien la seule chose à ma connaissance qui soit à peu près standard et que l’on peut retrouver dans n’importe quel langage [sérieux] : Perl, Ruby, .NET, Java, ...


Retour à La Une de Logo Paperblog

A propos de l’auteur


Olivier Duval 4 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Dossier Paperblog