Re: regexp novice

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



"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.




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



[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux