我希望匹配以下所有路径:
不要以" / foo-bar /"
开头或不以任何扩展名结尾(.jpg,.gif等)
的示例:
/foo-bar/aaaa/fff will not match
/foo-bar/aaaa/fff.jpg will not match
/aaa/bbb will match
/aaaa/bbbb.jpg will not match
/bbb.a will not match
这是我的正则表达式:
^\/(?!foo-bar\/).*(?!\.).*$
但是没有用,为什么?
谢谢!
答案 0 :(得分:1)
尝试匹配您不想要的内容会更容易。 PHP示例:
if (!preg_match('~^/foo-bar/|\.[^/]+$~', $url))
echo 'Valid!';
由于此部分.*(?!\.).*$
,您的模式无法正常工作。第一个.*
是贪婪的,并且将字符串的所有字符都带到结尾,之后,为了使模式的结束成功,正则表达式引擎将回溯一个字符(字符串的最后一个)。如果不是点,则(?!\.).*$
将始终匹配最后一个字符。
如果您绝对需要肯定模式,可以使用:
if (preg_match('~^/(?!foo-bar/)(?:[^/]*/)*+[^./]*$~', $url))
echo 'Valid!';
答案 1 :(得分:0)