php-general Digest 18 May 2012 13:25:51 -0000 Issue 7816

Topics (messages 317881 through 317892):

Re: regexp novice
        317881 by: Jim Giner
        317882 by: shiplu
        317883 by: Yared Hufkens
        317884 by: Jim Giner
        317885 by: Govinda
        317886 by: Jim Giner
        317887 by: Jim Lucas
        317888 by: Jim Giner
        317889 by: Jim Lucas
        317890 by: Jim Lucas
        317891 by: shiplu
        317892 by: Jim Giner

Administrivia:

To subscribe to the digest, e-mail:
        php-general-digest-subscr...@lists.php.net

To unsubscribe from the digest, e-mail:
        php-general-digest-unsubscr...@lists.php.net

To post to the list, e-mail:
        php-gene...@lists.php.net


----------------------------------------------------------------------
--- Begin Message ---
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.



--- End Message ---
--- Begin Message ---
On Fri, May 18, 2012 at 2:37 AM, Jim Giner <jim.gi...@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);
}


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

--- End Message ---
--- Begin Message ---
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? 
>
>
>

--- End Message ---
--- Begin Message ---
"Yared Hufkens" <y4...@yahoo.de> 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. 



--- End Message ---
--- Begin Message ---
> 
> 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
> 


--- End Message ---
--- Begin Message ---
Thank you !
"Govinda" <govinda.webdnat...@gmail.com> 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
>



--- End Message ---
--- Begin Message ---
On 5/17/2012 1:57 PM, shiplu wrote:
On Fri, May 18, 2012 at 2:37 AM, Jim Giner<jim.gi...@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....@gmail.com/pt.php
http://cmsws.com/examples/php/testscripts/shiplu....@gmail.com/pt.phps

Jim Lucas

--- End Message ---
--- Begin Message ---
"Jim Lucas" <li...@cmsws.com> 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 
>> Giner<jim.gi...@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....@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.




--- End Message ---
--- Begin Message ---
On 5/17/2012 8:07 PM, Jim Giner wrote:
"Jim Lucas"<li...@cmsws.com>  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
Giner<jim.gi...@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....@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?

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

--- End Message ---
--- Begin Message ---
On 5/17/2012 9:52 PM, Jim Lucas wrote:

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.


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

<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_time($time)?'valid':'invalid')."\n";

function valid_time($time) {
  if (
      preg_match('#^(\d{1,2}):?(\d{2})$#', $time, $m) &&
      ( 0 <= (int) $m[1] && 12 >= (int) $m[1] ) &&
      ( 0 <= (int) $m[2] && 59 >= (int) $m[2] )
     ) {
    return TRUE;
  }
  return FALSE;
}


--- End Message ---
--- Begin Message ---
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

--- End Message ---
--- Begin Message ---
"Jim Lucas" <li...@cmsws.com> wrote in message 
news:4fb5decc.20...@cmsws.com...
> On 5/17/2012 9:52 PM, Jim Lucas wrote:
>>
>> 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.
>>
>
> 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
>
> <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_time($time)?'valid':'invalid')."\n";
>
> function valid_time($time) {
>   if (
>       preg_match('#^(\d{1,2}):?(\d{2})$#', $time, $m) &&
>       ( 0 <= (int) $m[1] && 12 >= (int) $m[1] ) &&
>       ( 0 <= (int) $m[2] && 59 >= (int) $m[2] )
>      ) {
>     return TRUE;
>   }
>   return FALSE;
> }
>

I'll have to study your regexp - a lot of stuff I don't understand yet in 
play there.  Thanks for the sample! 



--- End Message ---

Reply via email to