2012-02-19 111 views
2

匹配RFC 2822日期的最佳正則表達式是什麼?RFC 2822日期正則表達式

基本上我想匹配Date: Sun, 19 Feb 2012 16:25:02 +0000出現在我收到的一些電子郵件中,但理想情況是獨立於語言。

我沒有在網上找到下面的正則表達式,但不知道如何做一個月語言無關(但仍符合其他) - 我相信,一個月應該在規範3個字符,但不能完全確定...

/^(?:(Sun|Mon|Tue|Wed|Thu|Fri|Sat),\s+)?(0[1-9]|[1-2]?[0-9]|3[01])\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+(19[0-9]{2}|[2-9][0-9]{3})\s+(2[0-3]|[0-1][0-9]):([0-5][0-9])(?::(60|[0-5][0-9]))?\s+([-\+][0-9]{2}[0-5][0-9]|(?:UT|GMT|(?:E|C|M|P)(?:ST|DT)|[A-IK-Z]))(\s+|\(([^\(\)]+|\\\(|\\\))*\))*$/ 
+0

您的時區規範不完整。例如,我的時區是EET,這不包括在內。我會出去接受任何三個或四個字母,而不是試圖構建一個完整的列表。 – tripleee 2012-02-19 21:07:12

+0

@tripleee所以爲此,我需要將'(?:ST | DT)'更改爲'(?:ST | ET | DT)' – MrJ 2012-02-20 08:32:48

+0

就像我寫的那樣,這很可能還不完全。我的回憶是,即使最後一封信是T,也不能依賴,但是我調查了這封信很長一段時間。由ITYM'[DES] T',但我會重複,我不認爲這就足夠了。另請參閱http://en.wikipedia.org/wiki/Lists_of_time_zones – tripleee 2012-02-20 13:40:20

回答

0

正如@tripleee指出的那樣,RFC2822的日期總是英文。但是,如果你從一個不嚴格遵循RFC2822的源並且可能使用不同語言的源解析日期,那麼你必須識別可能使用的語言集合,並且製作一個匹配任何月份/日期的正則表達式的任何這些語言的星期名稱。之後,您可以使用散列將捕獲的每週/每週星期名稱轉換爲您要使用的內部表示形式。

+0

RFC2822始終是英語。有些供應商錯誤地偏離了,但這是規格。 – tripleee 2012-02-19 19:56:20

+0

編程語言是PHP – MrJ 2012-02-19 20:41:19

+0

@tripleee規範說它將永遠是英語?那麼這是有趣的:) – MrJ 2012-02-19 20:42:29