代码之家  ›  专栏  ›  技术社区  ›  alexgolec

Regex将url与后缀匹配?

  •  1
  • alexgolec  · 技术社区  · 12 年前

    所以我有一个有趣的正则表达式挑战。考虑以下[django url routing]正则表达式:

    (/(?P<required_part>[a-zA-Z0-9\-]+))(/(?P<optional_part>[a-zA-Z0-9\-]+))?/postfix
    

    我有如下第二个URL(注意缺少后缀):

    (/(?P<required_part>[a-zA-Z0-9\-]+))(/(?P<optional_part>[a-zA-Z0-9\-]+))?
    

    换句话说,我得到了一个必需的部分,后面是可选的部分,然后是后缀 这也由可选部件匹配。 我希望所有以后缀结尾的URL都能被第一个匹配,而所有没有被第二个匹配。问题是,在所有情况下,后缀都被可选部分捕获,第二个模式匹配。

    我该如何处理?如果解决方案在我将其注入数据库时没有引入数据库注入漏洞,则加分。

    1 回复  |  直到 12 年前
        1
  •  2
  •   Lodewijk Bogaards    12 年前

    您可以通过添加 $ 最后,使第二个正则表达式只匹配路径中有两个目录的url,或者您可以在第二个regex的末尾添加一个负向前看,只搜索没有后缀的url作为第三个目录:

    ^(/(?P<required_part>[a-zA-Z0-9\-]+))(/(?P<optional_part>[a-zA-Z0-9\-]+))?(?!/postfix)
    

    我还建议添加一个 ^ 到正则表达式的开头。没有它,上面的正则表达式可以回溯和匹配 /foo/bar/postfix/baz .