2014-03-03 30 views
2

我正在製作一個腳本,經過大量電子郵件尋找兩個字符串。如何只在這個正則表達式中獲得一個匹配?

要麼它會找到been all shipped on [timestamp here]shipped by the seller on [timestamp here]

現在,我在$res[1]上找到一個空匹配項,如果它只找到第二個字符串,並且在$res[2]中爲空,如果它只找到第一個。我怎樣才能解決這個問題,所以它會一直填滿$res[1]找到的時間戳?

if (preg_match("/been all shipped on ([0-9]{4}\.[0-9]{2}\.[0-9]{2} [0-9]{2}:[0-9]{2})|shipped by the seller on ([0-9]{4}\.[0-9]{2}\.[0-9]{2} [0-9]{2}:[0-9]{2})/", strip_tags($message), $res)) { 

} 
+2

我們可以得到一些樣本數據(重要部分的片段),以便我們可以看到您的正則表達式是否正確? – dab

回答

6

你必須隔離時間戳,並把其餘的交替中:

"/(?:been all shipped|shipped by the seller) on (\d{4}\.\d{2}\.\d{2} \d{2}:\d{2})/" 

Regular expression visualization

Debuggex Demo

+0

這個作品,謝謝:) –

2

@ Akshay2598有你的情況下,最合適的答案。

另一種方法:你可以使用 「分支復位」 功能:

if (preg_match("/(?|been all shipped on ([0-9]{4}\.[0-9]{2}\.[0-9]{2} [0-9]{2}:[0-9]{2})|shipped by the seller on ([0-9]{4}\.[0-9]{2}\.[0-9]{2} [0-9]{2}:[0-9]{2}))/", strip_tags($message), $res)) { 

}

使用此功能,各組具有相同數量:(?|....(..)....|....(..)....)。這對於更復雜的情況可能有用。

+0

感謝您也擡頭:) –

+0

+1這真的很有用 – anubhava

相關問題