2012-11-02 18 views
1

我有一個正則表達式模式和可選匹配的問題。基本上我試圖提取含工時的字符串信息,可能是以下3種形式:正則表達式模式和可選匹配

$d1 = 'Fr: 9-12;'; 
$d2 = 'Mo: 9-12 und 15-18; alle 14 Tage spez. Migräneberatung bis 20 Uhr;'; 
$d3 = 'Mo: 9-12; alle 14 Tage spez. Migräneberatung bis 20 Uhr;'; 

$regex = ' 
    /
     (Mo|Di|Mi|Do|Fr|Sa|So)+:   # day follow by colon 
      \s+?       # a optional space 
     (\d+)\-(\d+)      # time from - to 
     (?:\s+?und\s+?(\d+)\-(\d+))  # optional time from - to 
      ;        
     (?:([^;]+))      # optional addt info 
    /x'; 

$rc = preg_match_all($regex, $d2, $m); 

print_r($m); 

字符串$d2工作沒有問題,我得到的所有預期的匹配,但琴絃$d1$d3做不匹配。我嘗試使用第二個時間部分和附加信息文本進行可選分組,但它不起作用。我得到空的比賽。我看不到這個瑕疵...

我想用preg_match_all來得到上述子串的所有匹配項,因爲它是一個很大的字符串,每個星期一到星期天上面的子串以$d1 - $d3每天。我不知道是否也可以使用分號作爲這個子字符串結束標記,這就是爲什麼我試圖將它與([^;]+)相匹配。 如果這不起作用,我可以選擇另一個分隔符來標記一天子字符串的結尾,並且首先拆分大字符串,並在循環中匹配子字符串。

我欣賞任何提示!先謝謝您的幫助!

回答

2

我可能是錯在這裏,但是這似乎工作:

$regex = ' 
    /
     (Mo|Di|Mi|Do|Fr|Sa|So):   # day follow by colon 
      \s+?       # a optional space 
     (\d+)\-(\d+)      # time from - to 
     (?:\s+?und\s+?(\d+)\-(\d+))?  # optional time from - to 
      ; 
     (?:([^;]+))?      # optional addt info 
    /x'; 

只是增加了可選元素可選性(問號)。

+0

確實,這是問題所在 - /感謝您的幫助:-) –