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"
我正在使用此正则表达式来匹配 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"