负数看头的词的Regex。

问题描述 投票:0回答:2

使用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).*$ 但它似乎与所有给出的例子都匹配。

regex pcre regex-lookarounds
2个回答
1
投票

使用

^\/songs\/(?!.*\/foo).+

请看 证明. 该 ^\/songs\/ 定位 /songs/ 一开始 (?!.*\/foo) 检查是否 /foo 在字符串的后面出现,并且 .+ 匹配剩下的东西。


1
投票

你用的是 /songs/.+(?!\/foo) 其中,负向预视是在贪婪的之后应用的 .+,之后 /songs/,将只是匹配一切,包括 /foo 直到结束,然后它将满足lookahead断言。你需要在匹配了 /songs//songs/<digits>.

你可以将此regex用于 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]);
© www.soinside.com 2019 - 2024. All rights reserved.