url 参数的正则表达式负前瞻

Regex negative lookahead for url parameter

我正在使用此正则表达式来匹配 YouTube 播放列表网址并提取播放列表 ID:

https://regex101.com/r/pO4dS6/31

但是,如果其中一个参数是 "v="(指定播放列表中的单个视频),我不希望正则表达式匹配。

在我上面的示例中,前 2 个 URL 应该匹配,后 3 个不匹配。

我正在尝试使用负前瞻 (?!v=),但它不起作用。我错过了什么?

您只是在测试立即出现的 v=。允许一些其他字符选择性地在其前面加上 .*:

(?!.*v=)

查看 regex101

更新

检查必须在 v= 之前的字符可能会更安全:

(?!.*[?&]v=)

查看 regex101

更新

尝试操作 url 数据时,通常最好使用 url 解析技术。这使得 parse_url() 成为一个直观的候选人。

你没有展示你的编码尝试(你仍然应该),但如果你可以考虑一个非正则表达式的解决方案,这将是可靠的:(Demo)

$in=['https://www.youtube.com/playlist?list=PLFgquLnL59akaNTxtgsoKn4c0Q8utjqku',
'http://www.youtube.com/embed/videoseries?list=PLdwCuEoZ_6l6C47ciTvf6Z2GArUOCHHQ3',
'https://www.youtube.com/watch?v=VTMcqVFk39s&index=2&list=PLxgKRG5rfVFa067PHSpju_XaTPiyii31L',
'https://www.youtube.com/watch?v=TpbTkbv4L2Y&list=PLvqxe4XbcSiEzrZm28NjsLXmHkffCJmBY&index=2',
'https://www.youtube.com/watch?index=2&list=PLxgKRG5rfVFa067PHSpju_XaTPiyii31L&v=VTMcqVFk39s'];
foreach($in as $v){
    parse_str(parse_url($v)['query'],$array);
    echo (!isset($array['v'])?$array['list']:'disqualified'),"\n";
}

输出:

PLFgquLnL59akaNTxtgsoKn4c0Q8utjqku
PLdwCuEoZ_6l6C47ciTvf6Z2GArUOCHHQ3
disqualified
disqualified
disqualified

我的方法:

  • 将每个 url 解析为组件数组,
  • 访问 "query" 元素,
  • 将键值对字符串转换为关联数组,
  • 检查是否存在 "v" 作为键,
  • 如果没有"v",access/output "list"值,
  • 如果"v",输出"disqualified"