2012-05-27 56 views
0

我需要之前「在Sun,2012年5月27日上午06點25,」被允許在PHP通用字符爆炸()

我希望能得到一切之前,「在XXX,XXX XX得到一切,xxxx在xx:xx xx,「

這裏的問題是,5月,27和6的長度都是可變的。這項工作的最佳工具是什麼?由於我缺乏正則表達式的經驗,我試圖使用explode(),但它並沒有出現,它可以在這裏完成這項工作。正則表達式是我的最佳選擇?

[編輯]

我最終使用了答案的組合。我去了:

preg_match(「/(.*)On \ s +(Sun | Sat | Fri | Thu | Wed | Tue | Mon),\ s +(January | February | March | April | May | June | ??七月|八月|九月|十月|十一月|十二月)\ S + \ d \ d \ S + \ d {4} \ S +在\ S + \ d \ d:\ d \ d \ S + [AP]男,/i「,$ to,$ end);

+1

你爲什麼不把strtotime()和date()結合使用? – HamZa

+0

我仍然不明白你想要做什麼。 – Ahatius

+0

哪裏是在一個字符串中的「之前」充滿了價值? – 2012-05-27 14:38:03

回答

2

這樣的事情,我想:

/On\s+(Sun|Sat|Fri|Thu|Wed|Tue|Mon),\s+(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d?\d,\s+\d{4}\s+at\s+\d?\d:\d\d\s+[AP]M,/i 

[編輯]

作爲每註釋:我已增加了對大小寫不敏感的(通過將i改性劑正則表達式的結尾) 。我還將表達式中的空格更改爲\s以允許任何空格字符,並且添加+以允許單詞之間有多個空格。

我沒有改變它支持漫長的一天的名稱或簡短的月份名稱,因爲問題指定月份名稱的長度是可變的,但沒有指定日期名稱爲變量。但是,如果需要,它應該足夠小以添加這些變體。

[編輯]

$to = "Let me know how this response looks..... On Sun, May 27, 2012 at 6:25 AM, Pr"; 
preg_match("/On\s+(Sun|Sat|Fri|Thu|Wed|Tue|Mon),\s+(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d?\d,\s+\d{4}\s+at\s+\d?\d:\d\d\s+[AP]M,/i", $to, $end); 

此代碼對你的評論給出的例子。

希望有所幫助。

+0

您應該支持:短名和全名('Sun'和'Sunday','Jan'和'January'),大寫/小寫和多個空格。 – flowfree

+0

@bsdnoobz - 我正在回答具體問題,沒有提供通用的日期正則表達式。星期幾並不是他指定的可變長度字段之一,所以我認爲它固定爲三個字符。相反,雖然「May」在這一點上可能是模棱兩可的,但是該月被指定爲可變長度,所以我提供了完整的月份名稱。問題中也沒有提及空格,所以我認爲它是固定的(因爲它可能是如果他從一個特定的源獲得輸入)。 – Spudley

+0

@bsdnoobz - 我已經編輯了你的一些*建議的答案(儘管我懷疑這是做得更多,以安撫你,而不是爲了OP的好處) – Spudley

1
preg_match('/(.*?) On \w+, \w+ \d?\d, \d+ at \d?\d:\d?\d \w\w,/', 'grab this text here On Sun, May 27, 2012 at 6:25 AM,', $matches); 
echo $matches[1]; 
// echoes 'grab this text here' 

(.*?)在開始處匹配的一切,\w+ 1次或更多次,\d?\d匹配一個或兩個數字

0

正規表達式工作,因爲這正是它被做了匹配任何字母數字字符:選擇數據基於一種模式。然而,你可以用','(逗號)爆炸,然後再將前4個元素再次聚合在一起形成你的句子。我懷疑在這種情況下使用正則表達式會更快。

最終,這是您的偏好:哪個更好,可讀性更高,您可以理解。 正則表達式在這種特殊情況下的主要優勢在於它們可以提取特定的值/模式,因此您可以輕鬆地將它們放在一邊。

$dateString = "On Sun, May 27, 2012 at 6:25 AM, some other text here"; 

// using explode/implode 
$result = explode(',',$dateString); 

print "we got: " . implode(',', array_slice($result,0,3)) . "\n"; 

// using regular expression 
$pattern = "/On [A-Z,a-z]{3}, [A-Z,a-z]{3} [0-9]+, [0-9]{4} at [0-9,:]+ (?:A|P)M/U"; 

preg_match($pattern,$dateString,$match); 

print "We got: " . $match[0] . "\n"; 

請還與初始tutorial

閱讀PHP manual, Regular Expressions subsection一起親自在這種情況下,我認爲REG EXP可能是矯枉過正視覺和性能明智的。儘管學習正則表達式,但他們有時會非常有幫助。

+0

我做錯了什麼? $ match [0]返回在2012年5月27日星期日上午7:48?我需要在返回之前發生的一切事情。 –

+0

哦,我的錯誤然後,我錯誤地解釋你的請求,因爲想要有日期字符串。抱歉。在這種情況下,您需要使用模式匹配和提取'$ pattern =「/(.*)On [AZ,az] {3},[AZ,az] {3} [0-9] +,[0 -9] {4}在[0-9,:] +(?:A | P)M/U「; preg_match($ pattern,$ dateString,$ match); print「我們得到了:」。 $ match [1]。 「\ n」 個; '並適應比賽。對不起,如果我困惑你。 –

+0

/(開始的exp exp)和On之間的(。*)是什麼已經改變它意味着你想要捕獲任何數據(。)無限次(*)(括號之間)和放置在$匹配數組中的結果第一個條目是整個字符串,第二個條目是第一個匹配) –