【问题标题】:php preg_match multiple patterns conditionallyphp preg_match 有条件地匹配多个模式
【发布时间】:2015-07-01 01:01:32
【问题描述】:

我有 2 种序列号格式,如果其中任何一种匹配,我想将页面重定向到指定的 URL。这是我的代码,它有 2 个正则表达式 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

【问题讨论】:

  • 向我们展示您要检查的字符串。
  • 尝试将ors 分组为/^(?:(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})$/ 没有样本无法进一步测试。
  • 您可以编写 两个 不同的 preg_match 测试(与您复杂的组合测试相反),每个正则表达式一个,然后您的 pb 变成一个简单的 php OR 测试。它也应该更容易阅读和维护......
  • 由于您的模式完全不清楚,您能否为两个示例字符串显示年、月和周?

标签: php regex preg-match


【解决方案1】:

你应该var_dump($matches);然后你会看到^(a)$|^(b)$ 产生 2 个组,而不是 1 个包含“a”或“b”的组。这意味着您应该将 if 语句更新为 if ($matches[1] == 'FL3' || $matches[5] == '25')

显然我不知道您的其余代码;但我不会像这样混合多个正则表达式;相反,我会将其分成两个单独的 if 语句:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-17
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多