Re: regexp novice

From: Date: Fri, 18 May 2012 04:52:31 +0000
Subject: Re: regexp novice
References: 1 2 3 4  Groups: php.general 
Request: Send a blank email to php-general+get-317889@lists.php.net to get a copy of this message
On 5/17/2012 8:07 PM, Jim Giner wrote:
"Jim Lucas"<lists@cmsws.com> wrote in message news:4FB5B89E.8050000@cmsws.com...
On 5/17/2012 1:57 PM, shiplu wrote:
On Fri, May 18, 2012 at 2:37 AM, Jim Giner<jim.giner@albanyhandball.com>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@gmail.com/pt.php http://cmsws.com/examples/php/testscripts/shiplu.net@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? <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.

« previous php.general (#317889) next »