2009-11-10 56 views
0

我有一個網站,我需要從收據中解析日期/時間字符串。這些可以有多種不同的格式 - 例如,一個字符串可以是'11/04/2009 12:46 PM',而另一個可以是'Mar06'09 10:57 AM'。我需要從他們那裏得到一個標準的日期/時間字符串來做一個數據庫插入。簡單的字符串轉換?

我想避免爲每個客戶端編寫新的php代碼來解析他們的字符串。我做的事情在其他地方是一個存儲正則表達式在數據庫領域 - 這樣,爲了驗證數據,我可以做

<?php 

if (! preg_match($row['regex'], $variable_user_input)) { ... } 

?> 

所以,如果我需要補充的是有不同的驗證標準客戶端,我只需編寫一個新的正則表達式,該正則表達式位於客戶端數據庫記錄中,而不是在網站上編寫,測試和部署新的PHP代碼。這是一個更強大的系統。

有沒有像正則表達式,當我可以輸入一個字符串,輸入另一個轉換字符串,並獲得我的日期時間作爲輸出?

回答

2

您可以使用正則表達式命名分組從具體格式

分離解析器
function parse_date($date, $regexps) { 
    foreach($regexps as $re) 
     if(preg_match($re, $date, $m)) 
      return strtotime("{$m['year']}-{$m['month']}-{$m['day']} {$m['time']}"); 
} 


$formats = array(
    "~(?P<month>[a-z]+)(?P<day>\d\d)'(?P<year>\d\d) +(?P<time>[\d:APM]+)~i", 
    "~(?P<month>\d\d)/(?P<day>\d\d)/(?P<year>\d\d\d?\d?) +(?P<time>[\d:APM]+)~i" 
); 


echo date("d m Y H i", parse_date("Mar06'09 10:57AM", $formats)); 
echo date("d m Y H i", parse_date('11/04/2009 12:46PM', $formats)); 

//編輯

命名的模式都相當稀疏文件,這是所有我能找到

自PHP 4.3.3起可以用(?Ppattern)命名子模式。然後,包含匹配的數組將包含由匹配索引的匹配字符串索引的匹配。

http://www.php.net/manual/en/regexp.reference.subpatterns.php

+0

謝謝,stereofrog!你能指點我一個指定子組的教程嗎?谷歌搜索沒有太多 - 只是在郵件列表中的引用。 – user151841 2009-11-10 18:09:50

2

這不處理正則表達式部分,但我敢打賭strtotime將在過程中的某個時刻發揮作用。