Preg match / regex probleem

  • Hallo iedereen,


    ik ben momenteel bezig met een registratie script en heb daarvoor de volgende regel gebruikt:

    Code
    if((!preg_match('/^[a-zA-Z0-9-_]/', $login)) || strlen($login) < 6 || strlen($login) > 12)
    		{
    			goto Error;
    		}


    Zoals je kan zien moet hij dus alleen logins met letters, cijfers - en _ doorlaten als ze tussen de 6 en de 12 tekens bevatten.
    Maar om een of andere gekke reden wil deze preg_match niks matchen zolang er één van de toegelaten tekens (letters en cijfers dus) vooraan in de string staat.
    a!!!!!!!!! komt er dus wel door maar !!!!!!!!! bijvoorbeeld niet.


    Heeft er iemand van jullie en idee wat ik fout zou kunnen doen?


    Bedankt voor de hulp!


    Willem

  • En deze werkt! Dankjewel


    (ik snap nog steeds niet wat ik fout deed maar goed...)

    Er zijn twee redenen waarom de originele regexp niet werkt zoals je wellicht zou verwachten.


    1. Je controleert niet de hele string. Als je alle karakters in een string wilt controleren moet je de juiste meta-karakters meegeven:
    - een ^ om de start van je input aan te geven
    - een $ om het einde van je input aan te geven (dit karakter ontbreekt)


    2. Je controleert maar één karakter. Met [...] definieer je een set geldige karakters; Vervolgens moet je ook aangeven hoeveel karakters je wilt controleren. Als je dit niet aangeeft controleer je precies 1 karakter.


    Jouw oorspronkelijke regexp controleert dus enkel het éérste karakter van je input.


    De suggestie van A.Tytgat dekt in principe de lading al (controleert de hele string van begin tot eind (^...$) en accepteert een niet-lege input door de + aan het einde (dit houdt in: 1 of meer karakters)).


    Maar in zijn suggestie is wel de underscore weggevallen :).


    Daarnaast kun je de expressie case-insensitive maken door de pattern modifier i - hiermee maak je de expressie case-insensitive.


    Ook kun je met quantifier meta karakters - { accolades } - een minimum en maximum lengte aangeven.


    De volgende reguliere expressie combineert alle bovenstaande punten:

    PHP
    <?php
    if (preg_match('#^[a-z0-9_-]{6,12}$#i', $input) == 1) {
        echo 'win';
    } else {
        echo 'fail';
    }
    ?>


    PRO TIP: Little known fact: de $-delimiter accepteert ook één newline karakter. De volgende invoer wordt dus ook geaccepteerd: "123456789012\n". Je doet er dus verstandig aan om je $login na afloop alsnog te ontdoen van een mogelijke newline door hier (r)trim() overheen te halen.


    .

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!