我正在编写一个简单的脚本来抓取YouTube URL的频道ID。
例如,要获取此URL上的频道ID:
$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_entities = [
'channel_id' => '/channel/([^/?#]+)', //match YouTube channel ID from url
'user' => '/user/([^/?#]+)', //match YouTube user from url
];
请参阅PHP演示。
使用[^/?#]+
模式,正则表达式不会遍历URL中的查询字符串,并且您将在输出中获得清晰的值。
完整代码片段:
function getYouTubeXMLUrl( $url) {
$xml_youtube_url_base = 'h'.'ttps://youtube.com/feeds/videos.xml';
$preg_entities = [
'channel_id' => '/channel/([^/?#]+)', //match YouTube channel ID from url
'user' => '/user/([^/?#]+)', //match YouTube user from url
];
foreach ( $preg_entities as $key => $preg_entity ) {
if ( preg_match( '/' . $preg_entity . '/', $url, $matches ) ) {
if ( isset( $matches[1] ) ) {
return [
'rss' => $xml_youtube_url_base . '?' . $key . '=' . $matches[1],
'id' => $matches[1],
'type' => $key,
];
}
}
}
}
测试:
$url = 'https://youtube.com/channel/UCBLAoqCQyz6a0OvwXWzKZag?PARAMETER=HELLO';
print_r(getYouTubeXMLUrl($url));
// => Array( [rss] => https://youtube.com/feeds/videos.xml?channel_id=UCBLAoqCQyz6a0OvwXWzKZag [id] => UCBLAoqCQyz6a0OvwXWzKZag [type] => channel_id )
$url = 'https://youtube.com/channel/UCBLAoqCQyz6a0OvwXWzKZag/RANDOMFOLDER';
print_r(getYouTubeXMLUrl($url));
// => Array( [rss] => https://youtube.com/feeds/videos.xml?channel_id=UCBLAoqCQyz6a0OvwXWzKZag [id] => UCBLAoqCQyz6a0OvwXWzKZag [type] => channel_id )