Regex php fonctionne pas (fr_fr, ...)

Bien le bonjoir !

J’ai une fonction regex qui me permet de valider (ou pas), mais elle ne marche pas.
Normalement “FR_fr” doit écrire “ok”, mais marche pas :’

<?php if(preg_match("@^([A-Z]{2})([_]{1})([a-z]{2})$@i", $VAR)) { echo "ok"; }else{ echo "eh non"; } ?>

Si quelqu’un peux m’aider s’il vous plait.
Merci d’avance :wink:

Alors je connais pas php: les @ sont pour délimiter la regex?
^[A-Z]{2}[a-z]{2}$ pas la peine de mettre {1} après l’underscore
les parenthèse te servent à capturer les 3 champs? FR, _ et fr? Si tu n’as pas besoin de capturer le _ tu met des parenthèses avec ?: comme ci-dessous
^([A-Z]{2})(?:
)([a-z]{2})$
Pourquoi met tu l’option i (qui dit ne tient pas compte des majuscules/minuscules) à la fin de ta regex puisque tu veux tenir compte des majuscules/minuscules?

si je respecte les exemple preg_match la syntaxe ce serait pas plutôt
preg_match(’^([A-Z]{2})(?:_)([a-z]{2})$',$VAR)
mieux tu met ta regex dans une variable
$pattern=’/^([A-Z]{2})(?:_)([a-z]{2})$/’
ce qui fait
preg_match($pattern,$VAR)

En fait je pense que ton problème vient de l’interprétation des caractères spéciaux dans ta regex à cause d’un problème de guillemets
Edité le 29/01/2015 à 19:23


regarde aussi que tans $VAR y'est pas un caractère de fin de ligne qui vienne parasiter le $ à la fin de ta regex

Tu peux améliorer ta regex comme ça

preg_replace('`^([A-Z]{2})(?:_)(?:(?i)\1)$'`,'`\1_\L\1'`,$VAR)

(?i) ne tient pas compte de la casse : donc le fr FR Fr fR
\1 ça reprend le premier motif capturé
\L ça met en minuscule le reste de l’expression donc fR Fr FR…devient fr

De cette façon le premier FR est en majuscules tandis que le second doit être fr (en majuscules ou minuscules) mais est remplacer par fr en minuscules

tu peux tester tes regex dans notepad++ pour rechercher et remplacer
Edité le 29/01/2015 à 19:58