使用 PCRE 风格,我试图想出一个正则表达式,只要它不包含 URL 后/foo
,它就会匹配/songs/{id}
/songs/902 => Match
/songs/902/ => Match
/songs/902/foo => No Match
/songs/902/foo/201/bar => No Match
/songs/902/bar => Match
这就是我到目前为止^/songs/.+(?!/foo).*$
的,但它似乎与所有给定的示例相匹配。
使用
^/songs/(?!.*/foo).+
请参阅证据。^/songs/
在开头找到/songs/
,然后(?!.*/foo)
检查字符串后面是否存在/foo
,并且.+
与剩余的内容匹配。
您正在使用/songs/.+(?!/foo)
,其中在贪婪.+
之后应用负前瞻,在/songs/
之后,将只匹配包括/foo
直到结束的所有内容,然后它将满足前瞻断言。您需要在匹配/songs/
或/songs/<digits>
后立即应用前瞻断言。
您可以在php
中使用此正则表达式,并进行负面展望:
~/songs/d+(?!.*/foob)~
正则表达式演示
正则表达式详细信息:
/songs/d+
: 匹配/songs/
后跟 1+ 位数字(?!.*/foob)
: 如果我们领先于当前位置/foo
,则负面展望比赛失败。
法典:
$re = '~/songs/d+(?!.*/foob)~';
preg_match_all($re, $input, $matches);
// Print the match result
var_dump($matches[0]);