Re: [PHP] regexp novice

2012-05-17 Thread Shiplu
Jim L. I did't actually consider that wide range of time values.  Here
is an update. Still  this can be written without help of regex. I must
add one more thing that a '00:01' is invalid in 12 hour format. OP
wants it to be 12-hour format.

function valid_time($time){
$m = substr($time, -2);
$h = (explode(':', substr($time, 0, -2)));
$h = $h[0];
return (is_numeric($h) && is_numeric($m) && $h>0 && $h<13 &&
$m>=0 && $m<60);
}

See the code in action here http://ideone.com/tSQIb

-- 
Shiplu Mokaddim
Talks: http://shiplu.mokadd.im
Follow: http://twitter.com/shiplu
Innovation distinguishes between follower and leader

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] regexp novice

2012-05-17 Thread Jim Lucas

On 5/17/2012 9:52 PM, Jim Lucas wrote:


How about this instead?

\d{1,2}):?(?P\d{2})$#', $time, $m);

if (
$m &&
( 0 <= (int) $m['hour'] && 12 >= (int) $m['hour'] ) &&
( 0 <= (int) $m['minute'] && 59 >= (int) $m['minute'] )
) {
return TRUE;
}

return false;

}

Let me know.



I optimized it a little...

http://www.cmsws.com/examples/php/testscripts/shiplu@gmail.com/pt_regex.php
http://www.cmsws.com/examples/php/testscripts/shiplu@gmail.com/pt_regex.phps

= (int) $m[1] ) &&
  ( 0 <= (int) $m[2] && 59 >= (int) $m[2] )
 ) {
return TRUE;
  }
  return FALSE;
}


--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] regexp novice

2012-05-17 Thread Jim Lucas

On 5/17/2012 8:07 PM, Jim Giner wrote:

"Jim Lucas"  wrote in message
news:4fb5b89e.8050...@cmsws.com...

On 5/17/2012 1:57 PM, shiplu wrote:

On Fri, May 18, 2012 at 2:37 AM, Jim
Ginerwrote:


ok - finally had to come up with my own regexp - and am failing.

Trying to validate an input of a time value in the format hh:mm, wherein
I'll accept anything like the following:
hmm
hhmm
h:mm
hh:mm

in a 12 hour format.  My problem is my test is ok'ing an input of 1300.

Here is my test:

   if (0 == preg_match("/([0][1-9]|[1][0-2]|[1-9]):[0-5][0-9]/",$t))
 return true;
else
 return false;

Can someone help me correct my regexp?




I can not correct your regexp. But I must tell you that trying to tweak a
regex for hours is surely **not productive**. If you got any type of text
processing dont always go for regular expression. This problem can be
solved just by simple string parsing.
Here I have done that for you.


function valid_time($time){
  $m  = (int) substr($time, -2);
  $h  = (int) substr($time, 0, -2);
  return ($h>=0&&   $h<13&&   $m>=0&&   $m<60);
}




That won't work, it doesn't account for the possibility of a single digit
hour field.

I would do something like this:

= 0&&  $hour<= 12 )&&
 ( $minute>= 0&&  $minute<= 59 )
   ) {
 return true;
   }
   return false;
}

It seems overly complicated, but it does check and error for the various
things that I could think of for possible input.

Give it a try and let us know.

See it in action here.
http://cmsws.com/examples/php/testscripts/shiplu@gmail.com/pt.php
http://cmsws.com/examples/php/testscripts/shiplu@gmail.com/pt.phps

Jim Lucas


Thanks for the work you did, but I really wanted to try to solve this using
the more "elegant" way, which from my readings over the last year as a new
php developer, seemed to be the regexp methodology.  I'm so close - it's
only the 1300,1400,etc. time values that are getting by my expression.

And thank you Shiplu also for your simple, but non-regexp, solution.  Yes -
it works and I had something similar that was just missing one more check
when I decided to explore the regexp method.



How about this instead?

\d{1,2}):?(?P\d{2})$#', $time, $m);

  if (
  $m &&
  ( 0 <= (int) $m['hour']   && 12 >= (int) $m['hour'] ) &&
  ( 0 <= (int) $m['minute'] && 59 >= (int) $m['minute'] )
 ) {
return TRUE;
  }

  return false;

}

Let me know.

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] regexp novice

2012-05-17 Thread Jim Giner

"Jim Lucas"  wrote in message 
news:4fb5b89e.8050...@cmsws.com...
> On 5/17/2012 1:57 PM, shiplu wrote:
>> On Fri, May 18, 2012 at 2:37 AM, Jim 
>> Ginerwrote:
>>
>>> ok - finally had to come up with my own regexp - and am failing.
>>>
>>> Trying to validate an input of a time value in the format hh:mm, wherein
>>> I'll accept anything like the following:
>>> hmm
>>> hhmm
>>> h:mm
>>> hh:mm
>>>
>>> in a 12 hour format.  My problem is my test is ok'ing an input of 1300.
>>>
>>> Here is my test:
>>>
>>>   if (0 == preg_match("/([0][1-9]|[1][0-2]|[1-9]):[0-5][0-9]/",$t))
>>> return true;
>>> else
>>> return false;
>>>
>>> Can someone help me correct my regexp?
>>>
>>>
>>>
>> I can not correct your regexp. But I must tell you that trying to tweak a
>> regex for hours is surely **not productive**. If you got any type of text
>> processing dont always go for regular expression. This problem can be
>> solved just by simple string parsing.
>> Here I have done that for you.
>>
>>
>> function valid_time($time){
>>  $m  = (int) substr($time, -2);
>>  $h  = (int) substr($time, 0, -2);
>>  return ($h>=0&&  $h<13&&  $m>=0&&  $m<60);
>> }
>>
>>
>
> That won't work, it doesn't account for the possibility of a single digit 
> hour field.
>
> I would do something like this:
>
> 
> $times = array(
> '100',  # valid
> '1100', # valid
> '1300', # invalid
> '01:00',# valid
> '12:59',# valid
> '00:01',# valid
> '00:25pm',  # invalid
> '', # valid
> 'a00',  # invalid
> '00',   # invalid
> );
>
> foreach ( $times AS $time )
> echo "{$time} is ".(valid_date($time)?'valid':'invalid')."\n";
>
> function valid_date($time) {
>   if ( ( $c_time = preg_replace('|[^\d:]+|', '', $time) ) !== $time )
> return false;
>
>   if ( ( $pos = strpos($c_time, ':') ) !== false ) {
> list($hour, $minute) = explode(':', $c_time, 2);
>   } else {
> $break  = (strlen($c_time) - 2);
> $hour   = substr($c_time, 0, $break);
> $minute = substr($c_time, $break, 2);
>   }
>   $hour = (int)$hour;
>   $minute = (int)$minute;
>
>   if ( strlen($c_time) <= 2 )
> return false;
>
>   if (
> ( $hour   >= 0 && $hour   <= 12 ) &&
> ( $minute >= 0 && $minute <= 59 )
>   ) {
> return true;
>   }
>   return false;
> }
>
> It seems overly complicated, but it does check and error for the various 
> things that I could think of for possible input.
>
> Give it a try and let us know.
>
> See it in action here.
> http://cmsws.com/examples/php/testscripts/shiplu@gmail.com/pt.php
> http://cmsws.com/examples/php/testscripts/shiplu@gmail.com/pt.phps
>
> Jim Lucas

Thanks for the work you did, but I really wanted to try to solve this using 
the more "elegant" way, which from my readings over the last year as a new 
php developer, seemed to be the regexp methodology.  I'm so close - it's 
only the 1300,1400,etc. time values that are getting by my expression.

And thank you Shiplu also for your simple, but non-regexp, solution.  Yes - 
it works and I had something similar that was just missing one more check 
when I decided to explore the regexp method.




-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] regexp novice

2012-05-17 Thread Jim Lucas

On 5/17/2012 1:57 PM, shiplu wrote:

On Fri, May 18, 2012 at 2:37 AM, Jim Ginerwrote:


ok - finally had to come up with my own regexp - and am failing.

Trying to validate an input of a time value in the format hh:mm, wherein
I'll accept anything like the following:
hmm
hhmm
h:mm
hh:mm

in a 12 hour format.  My problem is my test is ok'ing an input of 1300.

Here is my test:

  if (0 == preg_match("/([0][1-9]|[1][0-2]|[1-9]):[0-5][0-9]/",$t))
return true;
else
return false;

Can someone help me correct my regexp?




I can not correct your regexp. But I must tell you that trying to tweak a
regex for hours is surely **not productive**. If you got any type of text
processing dont always go for regular expression. This problem can be
solved just by simple string parsing.
Here I have done that for you.


function valid_time($time){
 $m  = (int) substr($time, -2);
 $h  = (int) substr($time, 0, -2);
 return ($h>=0&&  $h<13&&  $m>=0&&  $m<60);
}




That won't work, it doesn't account for the possibility of a single 
digit hour field.


I would do something like this:

= 0 && $hour   <= 12 ) &&
( $minute >= 0 && $minute <= 59 )
  ) {
return true;
  }
  return false;
}

It seems overly complicated, but it does check and error for the various 
things that I could think of for possible input.


Give it a try and let us know.

See it in action here.
http://cmsws.com/examples/php/testscripts/shiplu@gmail.com/pt.php
http://cmsws.com/examples/php/testscripts/shiplu@gmail.com/pt.phps

Jim Lucas

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] regexp novice

2012-05-17 Thread Jim Giner
Thank you !
"Govinda"  wrote in message 
news:3e5dce87-29c1-4679-ad3a-53326435f...@gmail.com...
>
> FWIW - I couldn't find much in the way of tutorials on the meanings of the
> various chars in regexp's.

this helps alot:

http://www.gskinner.com/RegExr/

you can paste your pattern (needle) in  the top input, and hover over each 
char to see what it means in grep land.
Paste your haystack in the big box (input), under that, to see where all 
your needle will be found.


>
>
>
> -- 
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>



-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] regexp novice

2012-05-17 Thread Govinda
> 
> FWIW - I couldn't find much in the way of tutorials on the meanings of the 
> various chars in regexp's. 

this helps alot:

http://www.gskinner.com/RegExr/

you can paste your pattern (needle) in  the top input, and hover over each char 
to see what it means in grep land.
Paste your haystack in the big box (input), under that, to see where all your 
needle will be found. 


> 
> 
> 
> -- 
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
> 


--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] regexp novice

2012-05-17 Thread Jim Giner
"Yared Hufkens"  wrote in message 
news:4fb5667d.7020...@yahoo.de...
> Try this:
> /(0?[1-9]|[12][0-9]):?[0-5][0-9]/
>
> FYI: ? is equal to {0,1}, and [1-9] to [123456789] (and therefore [1-2]
> to [12]).
>
>
> Am 17.05.2012 22:37, schrieb Jim Giner:
>> ok - finally had to come up with my own regexp - and am failing.
>>
>> Trying to validate an input of a time value in the format hh:mm, wherein
>> I'll accept anything like the following:
>> hmm
>> hhmm
>> h:mm
>> hh:mm
>>
>> in a 12 hour format.  My problem is my test is ok'ing an input of 1300.
>>
>> Here is my test:
>>
>>  if (0 == preg_match("/([0][1-9]|[1][0-2]|[1-9]):[0-5][0-9]/",$t))
>> return true;
>> else
>> return false;
>>
>> Can someone help me correct my regexp?
>>
>>
>>

Nope - that didn't work.  Tested it against  1900, 1300 and 13:00 and all 
came thru as OK.
Also - I don't understand at all the following:

> FYI: ? is equal to {0,1}, and [1-9] to [123456789] (and therefore [1-2]
> to [12]).

I know (?) that [1-9] validates any digit from 1 to 9 - I was already using 
that.
And your point about [1-2] doesn't make sense to me since I need to validate 
10:00 which [1-2] in my usage would cause 10:00 to fail.
And I don't know what ? means at all.

FWIW - I couldn't find much in the way of tutorials on the meanings of the 
various chars in regexp's. 



-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] regexp novice

2012-05-17 Thread Yared Hufkens
Try this:
/(0?[1-9]|[12][0-9]):?[0-5][0-9]/

FYI: ? is equal to {0,1}, and [1-9] to [123456789] (and therefore [1-2]
to [12]).


Am 17.05.2012 22:37, schrieb Jim Giner:
> ok - finally had to come up with my own regexp - and am failing.
>
> Trying to validate an input of a time value in the format hh:mm, wherein 
> I'll accept anything like the following:
> hmm
> hhmm
> h:mm
> hh:mm
>
> in a 12 hour format.  My problem is my test is ok'ing an input of 1300.
>
> Here is my test:
>
>  if (0 == preg_match("/([0][1-9]|[1][0-2]|[1-9]):[0-5][0-9]/",$t))
> return true;
> else
> return false;
>
> Can someone help me correct my regexp? 
>
>
>

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



Re: [PHP] regexp novice

2012-05-17 Thread shiplu
On Fri, May 18, 2012 at 2:37 AM, Jim Giner wrote:

> ok - finally had to come up with my own regexp - and am failing.
>
> Trying to validate an input of a time value in the format hh:mm, wherein
> I'll accept anything like the following:
> hmm
> hhmm
> h:mm
> hh:mm
>
> in a 12 hour format.  My problem is my test is ok'ing an input of 1300.
>
> Here is my test:
>
>  if (0 == preg_match("/([0][1-9]|[1][0-2]|[1-9]):[0-5][0-9]/",$t))
>return true;
> else
>return false;
>
> Can someone help me correct my regexp?
>
>
>
I can not correct your regexp. But I must tell you that trying to tweak a
regex for hours is surely **not productive**. If you got any type of text
processing dont always go for regular expression. This problem can be
solved just by simple string parsing.
Here I have done that for you.


function valid_time($time){
$m  = (int) substr($time, -2);
$h  = (int) substr($time, 0, -2);
return ($h>=0 && $h<13 && $m>=0 && $m<60);
}


-- 
Shiplu.Mokadd.im
ImgSign.com | A dynamic signature machine
Innovation distinguishes between follower and leader


[PHP] Re: regexp novice

2012-05-17 Thread Jim Giner
OOPS
FORGOT to mention that I modify the string to add a colon if it is entered 
without one, so my regexp
always expects a ":" to be in the middle.  So in actuality - my regexp is 
'passing' a value of 13:00 as legitimate, when it should not be.



-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[PHP] regexp novice

2012-05-17 Thread Jim Giner
ok - finally had to come up with my own regexp - and am failing.

Trying to validate an input of a time value in the format hh:mm, wherein 
I'll accept anything like the following:
hmm
hhmm
h:mm
hh:mm

in a 12 hour format.  My problem is my test is ok'ing an input of 1300.

Here is my test:

 if (0 == preg_match("/([0][1-9]|[1][0-2]|[1-9]):[0-5][0-9]/",$t))
return true;
else
return false;

Can someone help me correct my regexp? 



-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php