我找到了从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
答案 0 :(得分:0)
至于我如何改进你的评论模式:
~(?:[/?&]vi?[/=]|youtu\.be/|embed/)\K[\w-]{10,12}~
|
)不是字符类的工作方式。字符类([
.. ]
)是目标字符或字符范围的列表。通过在字符类中编写|
,您将|
作为有效字符包含在内。\w
相当于[A-Za-z0-9_]
,因此如果在适当的时候使用它,您的模式会更加简洁。\K
启动全字符串匹配,这样您就不需要使用任何捕获组来提取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]
)值。