所以我有一个有趣的正则表达式挑战。考虑以下[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都以postfix与第一个匹配,而所有不匹配的第二个匹配。问题是在所有情况下,后缀都被可选部分捕获,第二个模式匹配。
我该如何处理?如果解决方案在将其注入数据库时未引入数据库注入漏洞,则可获得奖励积分。
答案 0 :(得分:2)
您可以通过在末尾添加$
来限制第二个正则表达式的范围,从而使第二个正则表达式只匹配其路径中有两个目录的URL,或者您可以向其添加负向前导第二个正则表达式的结尾,仅搜索没有postfix作为第三个目录的URL:
^(/(?P<required_part>[a-zA-Z0-9\-]+))(/(?P<optional_part>[a-zA-Z0-9\-]+))?(?!/postfix)
我还建议在正则表达式的开头添加^
。如果没有它,上面的正则表达式可以回溯并匹配/foo/bar/postfix/baz
。