preg_match()
lundi 19 juin 2006 à 18:09 (Julien Tartarin)
Une petite expression régulière sympathique pour la route :
/^[a-z]{1}(-|(?<!--)([a-z0-9]{1})){2,18}[a-z0-9]{1}$/i
Son pitch, c'est de filtrer les pseudos de Lexode v8 selon leur nouveau format, c'est à dire en acceptant la présence de tirets. Par contre, pour des raisons d'arborescence de fichiers et de compatibilité/respect des normes, le pseudo doit commencer par une lettre et ne pas finir par un tiret. Et puisque c'est plus joli, les tirets consécutifs sont interdits !
J'ai eu la chance d'éplucher en détail la fantastique documentation de PHP (très complète !) pour écrire ce pattern un peu particulier (d'habitude, les expressions régulières sont un peu plus basiques).
Pour me faciliter la vie, j'ai décidé de mettre en place un unit test très basique et rapide pour être sûr en un coup d'œil que chaque cas prévu fonctionne comme attendu (ou pas, d'ailleurs), et j'ai écrit l'expression avec le modifier x (il permet de mettre des espaces pour faciliter la lecture des parenthèses).
Pour la petite histoire, la voilà décortiquée :
^[a-z]{1}on commence par une lettre[a-z0-9]{1}$on finit par un chiffre ou une lettre{2,18}entre tout ça, on a 2 à 18 caractères : le pseudo fait entre 4 et 20 caractères de toute façon-|(?<!--)([a-z0-9]{1})au milieu, on a soit un tiret, soit un chiffre ou une lettre qui n'est pas précédé(e) de deux tirets ((?<!--)([a-z0-9]{1}))
Pour exprimer cette condition sur les caractères précédents, c'est la chaîne ?<! qui importe. Et elle porte le doux nom d'assertion arrière négative.
C'est définitif : je suis amoureux des expressions régulières[1] !
Notes
[1] d'ailleurs, c'est comme ça que j'ai découvert la puissance de la programmation, il y a quelques années...

#1 Le lundi 19 juin 2006 à 23:35, par Enisséo
Je te montrerai peut-être un jour l'utilisation des masques récursifs pour permettre de parser des conditionnelles ou des boucles imbriquées dans un template ;) (mais sinon les assertions négatives ça sert à reconnaître des masques sans qu'ils soient précédés de \, et c'est pratique un peu)
#2 Le mardi 11 juillet 2006 à 19:08, par hel'
de 2 à 81, t'es sur qu'il y a pas de faute?
#3 Le mardi 11 juillet 2006 à 19:48, par Julien Tartarin
Modifié ^^
#4 Le mardi 18 juillet 2006 à 10:59, par hel
Car je ne mis connais pas trop en Regex mais je sais que c'étais de 2 à 81 XD