2011-02-07 84 views
1

我使用正則表達式如下在dd/mm/yyyy格式分析日期:正則表達式問題在PHP

^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$

我檢查它strfriend,這一切看起來確定。然而,在PHP與preg_match它測試時,它不承認它:

if(!preg_match("/^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$/",trim($_POST['dob']))){ 
    $error .= "You must enter a valid date of birth."; 
} 

這種情況與輸入如29/10/198701-01-2001,我不知道爲什麼它不工作!

我也得到了以下警告:

Warning: preg_match() [function.preg-match]: Unknown modifier '.' in /home/queensba/public_html/workers/apply.php on line 18

這我不知道如何解釋。

回答

4

如果你在正則表達式中使用'/',你可能不會用它開始/結束正則表達式。例如,用'#'代替它。

if(!preg_match("#^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$#",trim($_POST['dob']))){ 
    $error .= "You must enter a valid date of birth."; 
} 

(順便說一句,Modifiers會來最終delimiter「#」之後,所以該警告出現,因爲PHP認爲第二個「/」後的正則表達式將結束。)

+0

它是如何通過`「\ d」`作爲其未知的轉義序列? – sln 2011-02-07 21:52:53

+0

``\\ d「`也應該有效。像下面的`\ /`一樣,`\ d`不是作爲php轉義序列存在的,因此它對於正則表達式引擎保持esacped。 – giraff 2011-02-08 09:44:36

2

/你的正則表達式的行程內因爲PHP認爲它們是你的正則表達式分隔符。

嘗試

if(!preg_match("#^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$#",trim($_POST['dob']))){ 
    $error .= "You must enter a valid date of birth."; 
} 
1

由於您使用/.../的模式定界符就需要逃跑的所有其他實例/像\ /替代方法是使用一個不同的分隔符喜歡〜

+0

`\ /`不會在他的雙引號字符串 – sln 2011-02-07 21:49:33

1

不要對字符串使用雙引號,而是用於模板。 如果模式中有'/',則不能以相同的字符開頭和結尾,使用「%」,「#」或任何其他字符來執行... 如果您有unicode字符串,則必須使用「u」標誌。