2010-05-21 68 views
0

我該如何取這樣一行:PHP /正則表達式:匹配/替換24小時時間

數字表示(10:45),(11:30),12:00,12:40,13 :20,14:00,14:40,15:20,16:00,16:40,17:20,18:00,18:40,19:20,20:20,20:40,21:20 ,22:00,22:40,23:10,23:40。

並匹配所有的24小時時間,所以我可以使用date()轉換爲更人類可讀的格式?

此外,我想在24倍相匹配:00-24:59的範圍太

謝謝!

+2

請定義「更人類可讀的格式」。 – Johnsyweb 2010-05-21 15:10:41

+0

恕我直言,這是一個非常好的和人類可讀的格式。 – andr 2010-05-21 15:18:50

+0

您確定關於「24:00-24:59」範圍嗎? 不應該是「23.00-23.59」嗎?導致之後應該是「00.00-00.59」?? – Kunal 2010-05-21 15:58:25

回答

1

可能最容易匹配(\d{2}):(\d{2})(preg語法)之類的東西,然後將兩個子匹配轉換爲整數並檢查它們是否在正確的範圍內。

+0

+1:是的。如果$ 1> 12,則使用($ 1-12)。'pm',否則使用「{$ 1} am」。 – 2010-05-21 15:12:53

+0

這不適用於像120:44的字符串 – 2014-01-27 16:04:20

0
preg_match_all('/([0-2][\d]):(\d{2})/', $string, $matches) 

現在$ matches [0]數組包含所有人類可讀的時間。

如果您想打印特定日期沿着這些,每次餵過的strtotime()函數,這樣

foreach ($matches[0] as $time) echo date('Y-m-d H:i:s', strtotime($time)); 
+0

如果您使用$ matches [0],那麼不需要分組.../[0-2] \ d:\ d {2} /可以正常工作preg_match_all。 – null 2010-05-21 16:01:51

+0

是真的。我有分組比賽的習慣。如果他決定使用$ matches [1]和$ matches [2]數組分別僅訪問幾小時或幾分鐘,而不必分割字符串: – 2010-05-21 16:43:54

4

你可以使用正則表達式像下面,這使得從00:00值通過對包括24:59

(?:[01][0-9]|2[0-4]):[0-5][0-9] 

你似乎知道你在做什麼,所以我只舉一個簡單的例子,不把時間轉換成日期字符串。

$times = array(); 
if (preg_match_all('/(?:[01][0-9]|2[0-4]):[0-5][0-9]/', $subject, $matches)) { 
    $times = $matches[0]; 
} 
print_r($times); 

如果目標字符串有一個像1234:5678值的機會,這將導致上述正則表達式誤報,那麼你可以包裹在\b模式或其他一些斷言,以確保時間格式的數字謊言他們自己。

+0

@ mr.b:'$ matches [0]'包含所有項目的全部匹配(畢竟它是'preg_match_all') – salathe 2010-05-21 22:09:13

+0

我不確定爲什麼我想象它是代碼中的「foreach」而不是「if」。但是,再一次,它無論如何不會有任何意義。我的壞,對不起。刪除了我的評論。 – 2010-05-21 23:14:40

+0

應該是23:59作爲最大值? – 2013-04-04 14:57:23