为什么下载youtube文件ID不起作用?

时间:2018-02-23 16:23:07

标签: php regex url youtube preg-match

我找到了从youtube网站获取电影ID的代码,如果ID有连字符,那么该脚本很有效:#34; - "脚本没有从URL获取ID。我在正则表达式中表现不佳但仍尝试转换表达式,但我无法处理它。你可以指导我或告诉我我在做什么错误吗?谢谢

我的代码:

$links = array(
'https://www.youtube.com/watch?v=-SXKV0jDxuA',
'https://www.youtube.com/watch?v=ylfhCpi9AEU'
);
foreach ($links as $link){
    preg_match("#([\/|\?|&]vi?[\/|=]|youtu\.be\/|embed\/)(\w+)#", $link, $matches);
    var_dump(end($matches));
}   //result => ylfhCpi9AEU

1 个答案:

答案 0 :(得分:0)

至于我如何改进你的评论模式:

~(?:[/?&]vi?[/=]|youtu\.be/|embed/)\K[\w-]{10,12}~
  • 这使用了不同的模式分隔符 - 模式本身未使用的字符。这样可以避免不必要地转义模式中的字符。
  • 在字符类中使用管道(|)不是字符类的工作方式。字符类([ .. ])是目标字符或字符范围的列表。通过在字符类中编写|,您将|作为有效字符包含在内。
  • \w相当于[A-Za-z0-9_],因此如果在适当的时候使用它,您的模式会更加简洁。
  • \K启动全字符串匹配,这样您就不需要使用任何捕获组来提取ID(这可以提高性能并减少输出数组膨胀)。
  • 我在ID子字符串上使用了一个范围量词(正如其他StackOveflow用户所做的那样),以允许扩展有效的ID长度。如果我的模式因长度大于12的ID而过时,只需调整上限。

至于我如何编写我能想到的最具包容性的模式(考虑到我在StackOverflow周围发现的所有可能的url变体):

*请注意,这不会检查您网址的正面。它假设您只处理有效的YouTube网址。

~(?:[/?&](?:e|vi?|ci)(?:[/=]|%3D)|youtu\.be/|embed/|/user/[^/]+#p/(?:[^/]+/)+)\K[\w-]{10,12}~

This is a pattern demo,其中包含我发现的一长串youtube网址列表。 (我不会拼出这个模式的所有组成部分,因为对于你正在处理的网址来说可能有点过分。如果你或其他任何人希望我分解它,那就问问吧。)< / p>

*要非常清楚,我的模式并非旨在验证您的YouTube网址,而是设计用于从有效的YouTube网址中提取ID。

preg_match()一起使用时,您只需要访问第一个元素(全字符串匹配[0])值。