忽略URL的部分内容

  • 本文关键字:URL 忽略 php regex
  • 更新时间 :
  • 英文 :


我正在编写一个简单的脚本来抓取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 )

最新更新