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

时间:2017-08-06 21:14:25

标签: php regex regex-negation regex-lookarounds

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

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

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

在上面的示例中,前2个网址应匹配,最后3个网址不匹配。

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

2 个答案:

答案 0 :(得分:2)

您只是在测试v=的即时发生。允许其他一些字符可选地在其前面加.*

(?!.*v=)

请参阅regex101

上的更新

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

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

请参阅regex101

上的更新

答案 1 :(得分:0)

尝试操作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

我的方法:

  • 将每个网址解析为一个组件数组
  • 访问“query”元素
  • 将键值对的字符串转换为关联数组
  • 检查“v”是否存在,
  • 如果没有“v”,则访问/输出“list”值,
  • if“v”,输出“disqualified”