2014-03-03 25 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

相关问题