2012-03-29 123 views
0

以下模式有什麼問題?正則表達式,preg_match

~(?P<day>[1-9]{1,2})[.](?P<month>[1-9]{1,2})[.](?P<year>[0-9]{1,4})~ 

我想允許下列格式..

21.12.2012 
21.8.2012 // not 21.08.2012 

而且還允許..

2012.12.12 
12.12.12 

請幫助...

謝謝 Hardik

+0

所以你不想允許前導零?僅在月份還是在當天的部分?你的規格很模糊。另外,爲什麼不允許在第一位領先零? – 2012-03-29 10:05:44

+0

也是在白天... 2012年12月12日不應該被允許。 – hardik 2012-03-29 10:07:42

回答

3

你忘了anchor的正則表達式。另外,如果你只想讓四位數字的年份,你必須作出這樣明確的:

~^(?P<day>[0-9]{1,2})[.](?P<month>[0-9]{1,2})[.](?P<year>[0-9]{4})$~ 

^$只匹配字符串的開始和結束,以確保您的正則表達式不匹配12.12.12子串2012.12.12

如果你想禁止前導零,使用

~^(?P<day>[1-9][0-9]?)[.](?P<month>[1-9][0-9]?)[.](?P<year>[0-9]{4})$~ 

當然,這並不做任何健全檢查(99.99.9999通過這個表達式),但檢查有效日期是什麼you shouldn't be doing with a regex anyway

+0

謝謝你的回答,但仍然允許12.12.12和12.12.1如何限制它? – hardik 2012-03-29 09:50:05

+1

@Hardik:不,它沒有。你是否真的將'{1,4}'部分(意味着前一個標記的1-4個重複部分)改爲'{4}'(意味着完全重複4次)? – 2012-03-29 10:04:04

+0

哦,明白了......完成了......謝謝蒂姆Pietzcker ...... :) – hardik 2012-03-29 10:10:02

0

試試這個:

$regex = '#^[0-9]{2}.[1-9][0-9]{0,1}.[0-9]{4}$#'; 

應該允許2種第一格式,而不是別人。