使用PCRE的味道,我试图找到一个只要不包含以下内容的URL就能匹配的regex /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
直到结束,然后它将满足lookahead断言。你需要在匹配了 /songs/
或 /songs/<digits>
.
你可以将此regex用于 php
负向预视。
~/songs/\d+(?!.*/foo\b)~
注册送体验金详情。
/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]);