PHP expressions reguliere

Résolu
Bonjour,

j'ai une chaine a anlysé via un formulaire j'ai donc ecris ceci :

<?
if (ereg("^[a-z]{1}+[a-z0-9]{4,23}+[0-9a-z]{1}$",$p)==false) { echo "oui"; } else { echo "non;}
?>

visiblement cela fonctionne car ca oblige a avoir une lettre ou un chiffre en 1ere position puis chiffres et lettre ensuite entre 4 et 23 caracteres puis finir par un chiffre ou une lettre.

Mon soucis est tout bete je voudrais autorisé l'underscore mais pas que le visiteur me le mette 23 fois!
genre "a____________________________d"

alors j'ai testé ceci :

<?
if (ereg("^[a-z]{1}+[a-z0-9_]{4,23}+[0-9a-z]{1}$",$p)==false) { echo "oui"; } else { echo "non;}
?>

mais evidemment la il peu :(
je suis pas tres douée dans les expressions reguliere j'ai compris en gros mais ... vraiment en gros

un p'ti coup de main siouplait?
Configuration: Windows Vista
Safari 530.5

7 réponses

  1. une question : Tu veux bloquer a un combien d'underscrores maximum ?
    0
    1. parceque on peu faire ca??
      lol je suis vraiment debutante

      Et bien disons que j'aurais aimé autorisé un anderscore et pas au debut de la chaine ni a la fin.

      et pendant que j'y suis question idiote, j'ai fais mon petit bout de code avec la page de commentcamarche.net voici le lien pour ceux que ca interresse :
      https://www.commentcamarche.net/contents/803-php-expressions-regulieres

      et j'ai vu ceci "[:punct:]";
      cela va autorisé toutes les lettres accentués dans ma chaine?
      0
      1. euh? c'est ponctuation donc forcement c'est pas les caracteres accentués.. allalala
        donc je modifie il y'a pas l'equivalent pour autorisé par exemple tout les éèàç?
        0
        1. j'ai modifié mon code par ceci plus efficace que "ereg"
          Et j'ai vu que Php va supprimé cette fonction alors...

          <?
          $p = utf8_encode($p);

          if (preg_match("#^[a-z]{1}+([a-z0-9_àéèç]{4,23})+[0-9a-z]{1}$#",$p1)== false)
          { echo "</p>non";
          } else {
          echo "</p>c'est bon";
          };
          ?>

          bon y'a certainement mieux mais bon, en attendant de trouver comment limité les underscores....
          0
          1. Bin, tu peux faire un test en amont ou en aval pour les underscores,

            Avec comme pattern : $sParttern = "/[_ ]{2,}/"; //Cherche au moins 2 underscrores

            ou meme tu peut direct faire un preg_replace avec en $sReplace = "_";

            EnjoY !
            0
            1. j'ai lu je sais plus ou que pour limiter le nombre caracteres equivalent on doit mettre un point.
              je vais testé ton bout de code sinon effectivement je pourrai creer une fonction pour detecter le nombre d'underscore et les supprimé...
              bon c'est pas gagné je vais testé
              merchi :)
              0
              1. bon après avoir pas mal tournée en bourrique j'ai finalement opté pour ce code qui me va...

                Y'a certainement mieux mais bon.. j'en ai marre lol
                je post ici si cela peu aider quelqu'un

                <?
                //pour compter les caractères d'une chaine, ici underscore a vous d'y mettre ce que vous voulez d'autres...
                $CompteUnderscore = preg_match_all("(\_)",$Pseudooo, $out, PREG_PATTERN_ORDER);

                if ($CompteUnderscore >1) { etc......

                //et pour evité les doublons j'ai ceci

                // Si 3 chiffres identique d'affilé alors il en laisse 1
                function PasDeCaIici( $toto, $maxCarac = 3) {
                $var = '0123456789';
                $recherche = array();
                $remplace = array();

                for($i=0,$len=strlen($var);$i<$len;++$i) {
                $recherche[] = '~'.$var[$i].'{'.$maxCarac.',}~i';
                $remplace[] = $var[$i];
                }

                return preg_replace( $recherche, $remplace, $toto);
                }
                ?>

                voilou
                0