On 5/17/2012 8:07 PM, Jim Giner wrote:
"Jim Lucas"<lists@xxxxxxxxx> wrote in message
news:4FB5B89E.8050000@xxxxxxxxx...
On 5/17/2012 1:57 PM, shiplu wrote:
On Fri, May 18, 2012 at 2:37 AM, Jim
Giner<jim.giner@xxxxxxxxxxxxxxxxxx>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);
}
That won't work, it doesn't account for the possibility of a single digit
hour field.
I would do something like this:
<?php
$times = array(
'100', # valid
'1100', # valid
'1300', # invalid
'01:00', # valid
'12:59', # valid
'00:01', # valid
'00:25pm', # invalid
'0000', # 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.net@xxxxxxxxx/pt.php
http://cmsws.com/examples/php/testscripts/shiplu.net@xxxxxxxxx/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?
<pre><?php
$times = array(
'100', # valid
'1100', # valid
'1300', # invalid
'01:00', # valid
'12:59', # valid
'00:01', # valid
'00:25pm', # invalid
'0000', # 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;
preg_match('#^(?P<hour>\d{1,2}):?(?P<minute>\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