如何在这个正则表达式中只获得一场比赛?

时间:2014-03-03 20:47:40

标签: php regex

我正在制作一个脚本,通过大量的电子邮件寻找两个字符串。

它会找到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 个答案:

答案 0 :(得分:6)

您必须隔离时间戳并将其余内容置于交替中:

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

Regular expression visualization

Debuggex Demo

答案 1 :(得分: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)) {

}

使用此功能,组具有相同的编号:(?|....(..)....|....(..)....)。这对于更复杂的案例非常有用。