php有条件地匹配多个模式


php preg_match multiple patterns conditionally

我有两种序列号格式,如果其中任何一种匹配,我想将页面重定向到指定的URL。下面是我的代码,它有两个正则表达式ORed,后面是一个ORed条件语句,它使用正则表达式中的一个组:

$snregex = "/^(FL3)20([0-9]{2})([0-9]{2})([0-9]{5})$|^S[XNS][42][10][0]-([0-9]{2})([0-9]{2})([0-9]{2})-[0-9]{4}$/";
if (preg_match($snregex, $sn, $matches)) {
    $mm = $matches[1];
    $yr = $matches[2];
    $wk = $matches[3];
    # If SN MM codes are 25 or FL3 then use host server         
    if ($matches[1] == 'FL3' || $matches[1] == '25') {
        $url = "http://192.168.10.115/logs/20" . $yr . "/" . $wk . "/" . $sn . "/";
        # Redirect to host server
        redirect($url, '303');

该代码只适用于我在preg_match条件语句中首先放入的任何正则表达式,即如果FL3正则表达式是第一个,则我可以成功匹配序列号,但不能匹配另一个。同样,如果我先将该语句更改为"25"序列号,我可以成功匹配该序列号,但不能匹配另一个。以下内容有问题吗:

$snregex = "/^(FL3)20([0-9]{2})([0-9]{2})([0-9]{5})$|^S[XNS][42][10][0]-([0-9]{2})([0-9]{2})([0-9]{2})-[0-9]{4}$/";

有效序列号示例为:

FL320150500022

SS210-251509-0098

您应该var_dump($matches);那么您将看到^(a)$|^(b)$结果为2组,而不是包含"a"或"b"的1组。这意味着您应该将if语句更新为类似if ($matches[1] == 'FL3' || $matches[5] == '25')的内容。

很明显,我不知道你代码的其余部分;但我不会像这样混合多个regexp;相反,我会把它吐成两个单独的if语句:

if (preg_match(FL...))
    $url = '...';
elseif (preg_match(25))
    $url = '...';