Php 忽略URL的某些部分
我正在编写一个简单的脚本来获取YouTube URL的频道ID 例如,要获取此URL上的频道ID:Php 忽略URL的某些部分,php,regex,Php,Regex,我正在编写一个简单的脚本来获取YouTube URL的频道ID 例如,要获取此URL上的频道ID: $url = 'https://youtube.com/channel/UCBLAoqCQyz6a0OvwXWzKZag'; 我使用正则表达式: preg_match( '/\/channel\/(([^\/])+?)$/', $url, $matches ); 很好。但是,如果URL在通道ID之后有任何额外的参数或其他内容,它就不起作用。例如: https://youtube.com/cha
$url = 'https://youtube.com/channel/UCBLAoqCQyz6a0OvwXWzKZag';
我使用正则表达式:
preg_match( '/\/channel\/(([^\/])+?)$/', $url, $matches );
很好。但是,如果URL在通道ID之后有任何额外的参数或其他内容,它就不起作用。例如:
https://youtube.com/channel/UCBLAoqCQyz6a0OvwXWzKZag?PARAMETER=HELLO
https://youtube.com/channel/UCBLAoqCQyz6a0OvwXWzKZag/RANDOMFOLDER
etc...
我的问题是,如何调整我的正则表达式,使其与这些URL一起工作?我们不想与随机参数等匹配
请随意测试我的代码。您可以通过以下方式修复regexp:
$preg\u实体=[
'channel_id'=>'\/channel\/([^\/?\]+),//从url匹配YouTube频道id
“user'=>“\/user\/([^\/?\]+)”,//从url匹配YouTube用户
];
看
使用[^\/?#]+
模式,正则表达式不会遍历URL中的查询字符串,您将在输出中获得清晰的值
完整代码段:
函数getYouTubeXMLUrl($url){
$xml\u youtube\u url\u base='h'ttps://youtube.com/feeds/videos.xml';
$preg_实体=[
'channel_id'=>'\/channel\/([^\/?\]+),//从url匹配YouTube频道id
“user'=>“\/user\/([^\/?\]+)”,//从url匹配YouTube用户
];
foreach($key=>$preg_实体的preg_实体){
if(preg_match('/'.$preg_entity'/',$url,$matches)){
if(isset($matches[1])){
返回[
“rss'=>$xml\u youtube\u url\u base.”?“.$key.”='.$matches[1],
'id'=>$matches[1],
'type'=>$key,
];
}
}
}
}
测试:
$url='1!'https://youtube.com/channel/UCBLAoqCQyz6a0OvwXWzKZag?PARAMETER=HELLO';
打印(getYouTubeXMLUrl($url));
//=>数组([rss]=>https://youtube.com/feeds/videos.xml?channel_id=UCBLAoqCQyz6a0OvwXWzKZag [id]=>UCBLAOQQYZ6A0OVWXWZKZAG[type]=>channel_id)
$url='1https://youtube.com/channel/UCBLAoqCQyz6a0OvwXWzKZag/RANDOMFOLDER';
打印(getYouTubeXMLUrl($url));
//=>数组([rss]=>https://youtube.com/feeds/videos.xml?channel_id=UCBLAoqCQyz6a0OvwXWzKZag [id]=>UCBLAOQQYZ6A0OVWXWZKZAG[type]=>channel_id)
尝试'channel\u id'=>'\/channel\/([^\/?\]+)
和'user'=>'\/user\/([^\/?\]+)
。看看@WiktorStribiżew Dude,你就是这个平台上的regex传奇人物。非常感谢。你想发布一个答案让我接受吗?提示:当你与里面的URL共享IDEONE链接时,请注意URL字符串,否则网站将为除你之外的所有用户“屏蔽”它们,并且仅在“宽限期”内。