我正在研究一个项目,有些东西我无法解决。
用户只需在表格中添加YouTube剪辑链接即可将YouTube视频添加到自己的个人资料中:\ n \ nGG:
Youtube链接:youtube.com/watch?v=9YgjZ4oPrj4
现在,一旦用户点击提交,就必须嵌入视频。唯一的问题是我只需要这个部分9YgjZ4oPrj4
进行嵌入
(见下面的代码)
<iframe width="560" height="315" src="http://www.youtube.com/embed/9YgjZ4oPrj4" frameborder="0" allowfullscreen></iframe>
现在,如您所知,YouTube视频有不同类型的链接:
youtube.com/watch?v=9YgjZ4oPrj4
youtu.be/9YgjZ4oPrj4
如何使这个工作? 它实际上与Facebook使用相同
答案 0 :(得分:2)
以下是一些可以从字符串中提取YouTube ID的代码。 注意我只是copied it from Forrst,但它应该做你想做的事。
function youtube_id($url){
$url = preg_replace('((http://)?(www\.)?(youtube\.com|youtu\.be)(/v/|/watch\?v=|/)([a-zA-Z0-9_-]*)(.*))',"$5",$url);
return (preg_match('(([a-zA-Z0-9_-]*){11,18})',$url) ? $url : '');
}
测试了以下网址。
"http://www.youtube.com/watch?v=pkPgYbdQ1kQ&feature=feedu"
"www.youtube.com/watch?v=pkPgYbdQ1kQ&feature=feedu"
"youtube.com/watch?v=pkPgYbdQ1kQ&feature=feedu"
"http://www.youtube.com/v/pkPgYbdQ1kQ&feature=feedu"
"www.youtube.com/v/pkPgYbdQ1kQ&feature=feedu"
"http://youtu.be/pkPgYbdQ1kQ"
"youtu.be/pkPgYbdQ1kQ"
答案 1 :(得分:1)
您可以构建主机名和闭包的地图:
$tubes = array(
'youtube.com' => function($parsed_url) {
//$parsed_url contains data as returned by parse_url()
},
'youtu.be' => function($parsed_url) {
//
},
);
然后使用正则表达式解析内容,获取网址,并通过调用地图中的适当元素来传递这些网址。
这种方法更通用,因为你不仅限于youtube,你可以轻松地为任何主机添加助手,包括vimeo和上帝知道什么,随着需要弹出。
示例工作实施,我将其余部分留给您:
<?php
$text = 'http://youtube.com/watch?v=9YgjZ4oPrj4
http://youtu.be/9YgjZ4oPrj4';
$tubes = array(
'youtube.com' => function($parse_url) {
parse_str($parse_url['query'], $query);
return "<iframe width='560' height='315' src='http://www.youtube.com/embed/$query[v]' frameborder='0' allowfullscreen></iframe>";
},
);
$replace = function($matches) use ($tubes) {
$url = parse_url($matches[0]);
if(isset($tubes[$url['host']])) {
return $tubes[$url['host']]($url);
}
return $matches[0];
};
$matches = preg_replace_callback('/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/', $replace, $text);
var_dump($matches);
如果您需要新的启发式方法,请将它们添加到$tubes
地图。