TheGPWorx
TheGPWorx

Reputation: 887

Using regular expressions to match a time interval

I'm having problems on how to preg_match this time statement.

TF 02:30 pm-04:00 am

I was able to separate the time into the array but I also want to get the AM and PM as well as the letter T and F. This is for a class schedule module that I am working on. The data I got from the database is that string. I want to separate them so that I can manipulate the entries for the calendar that I have.

Here's what I have at this point.

$sampleString = 'T 02:30 pm-04:00 am';
$pattern = '/([0-1]?\d|2[0-9]):([0-5]?\d)/';
preg_match_all($pattern,$sampleString,$time);

print_r($time);

The output:

Array ( 
    [0] => Array ( 
          [0] => 02:30 
          [1] => 04:00 ) 
    [1] => Array ( 
          [0] => 02 
          [1] => 04 ) 
    [2] => Array ( 
          [0] => 30 
          [1] => 00 ) 
) 

Thanks.

Upvotes: 1

Views: 2058

Answers (1)

femtoRgon
femtoRgon

Reputation: 33341

As recommended by IMSoP, splitting this up into parts makes it easier (looking again, I think your hour regex could use improvement, as it will accept hours from 0-29, I've changed it to 0?[1-9]|1[0-2] instead, to accept only 1 - 12)

  • Days: [MTWHFS]+
  • Space: \s
  • Hour: 0?[1-9]|1[0-2]
  • Colon: :
  • Minute: [0-5]?\d
  • Space: \s
  • am/pm: [ap]m
  • hyphen: -
  • Hour: 0?[1-9]|1[0-2]
  • Colon: :
  • Minute: [0-5]?\d
  • Space: \s
  • am/pm: [ap]m

Then just put them together, surrounding the desired capturing groups with parentheses:

([MTWHFS]+)\s(0?[1-9]|1[0-2]):([0-5]?\d)\s([pa]m)-(0?[1-9]|1[0-2]):([0-5]?\d)\s([pa]m)

Upvotes: 1

Related Questions