Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW

Subscription Stuff

by Anonymous Monk
on Aug 03, 2002 at 17:02 UTC ( #187354=perlquestion: print w/replies, xml ) Need Help??

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi Monks, I am writing a script to take data from a web page and validate it. Most of the script is done, including the length validation. The only bit i am stuck on as i do not understand perl all that well is the validation of symbols. The field $username must have either characters i.e 'bob' or characters and digits i.e 'bob1' but not just digits i.e '1234565'. It cannot have any symbols either, only _- are to be accepted i.e for usernames 'bob-jones' or 'tom_frank'. The current piece of code i have below does not do exactly what i want it to do, but if somebody could modify it, so that i can plonk it back into my script i would be eternaly gratefull.
if ($display !~ /^\w*$/) { $message = $message.$errmsg ; $found_err = 1 ; }
Thank-you for reading this, and i know for most of you this is simple - but i'm rubbish at this type of thing.

Replies are listed 'Best First'.
Re: Subscription Stuff
by DamnDirtyApe (Curate) on Aug 03, 2002 at 17:44 UTC
    unless ( ( $display =~ /^[\w-]+$/ ) # Can contain chars, digits, _ +and - && ( $display !~ /^\d+$/ ) # But not just digits ) { # String failed to validate. }

    If you're having trouble with the regexps presented, I suggest you give perlre a good long read -- they only get worse from here. :-)

    Those who know that they are profound strive for clarity. Those who
    would like to seem profound to the crowd strive for obscurity.
                --Friedrich Nietzsche
Re: Subscription Stuff
by Zaxo (Archbishop) on Aug 03, 2002 at 17:18 UTC

    You want to match at least one, so use '+' instead of '*' as the quantifier. Having passed that, you want to match a non-digit:

    sub is_word_with_nondigit { # $_ = shift; # /^\w+$/ and /\D/; $_[0] =~ /^\w+$/ and $_[0] =~ /\D/; }

    A different quantifier may be used if you want a minimum length, like /^\w{4,}$/

    Update: Modified code to untaint the sub's argument, instead of checking a copy. If you don't like side effects use the commented-out version.

    After Compline,

Re: Subscription Stuff
by Cine (Friar) on Aug 03, 2002 at 17:06 UTC
    Whats wrong with all the answers you got in 186609??

    T I M T O W T D I
      i am stupid, i couldn't integrate any of those answers into the script i already have. also i need it to validate wether just number have been entered
Re: Subscription Stuff
by BronzeWing (Monk) on Aug 03, 2002 at 21:40 UTC

    I felt an itch to try to do this in one regex. Admittedly it's a longer string than checking with two short ones, but here's a single regex that I believe does the same thing:


    Basically, "There must be a single character that is a letter, a dash, or an underscore. It can also have any number of characters before or after it if none of those characters are anything but word characters (letters or underscores) or dashes."


Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://187354]
Approved by Cine
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (3)
As of 2023-03-27 23:05 GMT
Find Nodes?
    Voting Booth?
    Which type of climate do you prefer to live in?

    Results (66 votes). Check out past polls.