使用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).*$
,但似乎与所有给定的示例都匹配。
答案 0 :(得分:2)
使用
^\/songs\/(?!.*\/foo).+
请参见proof。 ^\/songs\/
将/songs/
放在开头,然后(?!.*\/foo)
检查字符串中是否以后有/foo
,并且.+
匹配剩余的内容。
答案 1 :(得分:1)
您正在使用/songs/.+(?!\/foo)
,其中在贪婪.+
之后应用否定的超前查询,即在/songs/
之后,将匹配包括/foo
的所有内容直到结束,然后它将满足前瞻性断言。您需要在匹配/songs/
或/songs/<digits>
之后立即应用前瞻性断言。
您可以在php
中使用此正则表达式,使负前瞻:
~/songs/\d+(?!.*/foo\b)~
RegEx详细信息:
/songs/\d+
:匹配/songs/
后跟1个以上数字(?!.*/foo\b)
:如果我们在当前位置之前/foo
,则负向搜索将使比赛失败。代码:
$re = '~/songs/\d+(?!.*/foo\b)~';
preg_match_all($re, $input, $matches);
// Print the match result
var_dump($matches[0]);