我正在使用此正则表达式来匹配YouTube播放列表网址并提取播放列表ID:
https://regex101.com/r/pO4dS6/31
但是,我不希望正则表达式匹配,如果其中一个参数是“v =”,它指定播放列表中的单个视频。
在上面的示例中,前2个网址应匹配,最后3个网址不匹配。
我正在尝试使用否定前瞻(?!v =),但它不起作用。我错过了什么?
答案 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
我的方法: