【问题标题】:How to find an exact match using regex in PHP?如何在 PHP 中使用正则表达式找到完全匹配?
【发布时间】:2018-07-03 00:36:24
【问题描述】:

我在尝试将我的 URL 与我在 PHP 中的正则表达式模式进行匹配时遇到了一些问题。

我的正则表达式:

/article/([0-9A-Za-z]++)/post/([0-9A-Za-z-_]++)

public function matches(Route $route){
    $uri = filter_var(strip_tags($_SERVER['REQUEST_URI']), FILTER_SANITIZE_URL);
    if (preg_match('#' . "/article/([0-9A-Za-z]++)/post/([0-9A-Za-z-_]++)" . '#i', $uri, $this->matches)) {
        return true;
    }
    return false;
}

示例 1: 有效匹配(良好)

/article/AB545455DSAF54FSA45S4F4/post/FGFG-FGFGF-5FG54FGF-FGFGFG

但也匹配这个(不好):

/article/AB545455DSAF54FSA45S4F4/post/FGFG-FGFGF-5FG54FGF-FGFGFG/fgfg/fgfgfg/fgf

我只想匹配第一个示例,那么我该如何解决这个问题?谢谢

【问题讨论】:

    标签: php regex routing preg-match preg-match-all


    【解决方案1】:

    在你的正则表达式中添加一个终止锚:

    /article/([0-9A-Za-z]+)/post/([0-9A-Za-z-_]+)$
                                                 ^^^
    

    anchor 将确保在最终组件之后不再出现子目录。

    public function matches(Route $route){
        $uri = filter_var(strip_tags($_SERVER['REQUEST_URI']), FILTER_SANITIZE_URL);
        if (preg_match('~/article/[0-9A-Za-z]+/post/[0-9A-Za-z_-]+$~", $this->matches)) {
            return true;
        }
        return false;
    }
    

    请注意,在正则表达式中匹配某项或多次使用一个加号,而不是其中两个。

    我可能没有你的确切代码在这里工作,但我建议的模式似乎在下面的演示中工作。

    Demo

    【讨论】:

    • 太棒了,感谢您的建议。我使用 ++ 是因为我在 github 上看到了也使用它的代码 protected $match_types = array( 'i' => '[0-9]++', 'a' => '[0-9A-Za-z]++', 'h' => '[0-9A-Fa-f]++', 's' => '[0-9A-Za-z-_]++', '*' => '.+?', '**' => '.++', '' => '[^/\.]++' );
    • @Tim Biegeleisen : 我以为你是数据库专家 :)
    • @sumit 我是 Stack 杂食动物。如果它有心跳,我会吃掉它:-)
    • @Tim 请更改分隔符以避免模式内转义。另外,请将连字符移动到字符类的前面或后面,以免创建范围。最后,捕获组不是必需的。
    • 只是模式分隔符。我可能会选择~。然后你可以在模式中“取消转义”/s。 ~/article/[0-9A-Za-z]+/post/[0-9A-Za-z_-]+$~ 现在我想起来 \w 会很好地放在这个模式中,以简洁起见。 regex101.com/r/Ty1jVf/1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多