On Mon, 25 Jan 2016 16:16:40 -0800
SSC_perl <[email protected]> wrote:
> I'm trying to find a way to trap bad item numbers. I want to
> parse the parameter "itemid=" and then everything up to either an "&"
> or end-of-string. A good item number will contain only ASCII
> letters, numbers, dashes, and underscores and may terminate with a
> "&" or it may not (see samples below). The following string should
> test negative in the regex below:
>
> my $QUERY_STRING = 'itemid=AT18C&i_AT18C=1';
>
> but a string containing "itemid=AT18/C" should test positive, since
> it has a slash.
>
> I can catch a single bad character and get it to work, e.g.
>
> if ( $QUERY_STRING =~ m| itemid= .*? [/]+? .*? &? |x ) {
>
> but I'd like to do something like this instead to catch others:
>
> if ( $QUERY_STRING =~ m| itemid= (?: .*? [^a-zA-Z0_-]+ .*? ) &? |x )
> { ...
>
> Unfortunately, I can't get it to work. I've read perlretut,
> but can't see the answer. What am I doing wrong?
>
> Thanks,
> Frank
>
> Here are a couple of test strings:
>
> 'itemid=AT18C&i_AT18C=1&t=main.htm&storeid=1&cols=1&c=detail.htm&ordering=asc'
>
> 'c=detail.htm&itemid=AT18C'
>
>
>
>
Use the negative match operator !~
if( $QUERY_STRING !~ m{ itemid = [-0-9A-Za-z_]+? (?: \& | \z ) }msx ){
print "bad: $QUERY_STRING\n";
}
--
Don't stop where the ink does.
Shawn
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/