1

我正在做一个项目,但有些事情我无法完全解决。

用户只需在表单中添加 YouTube 剪辑的链接,就可以将 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 使用的相同

4

2 回答 2

2

下面是一些将从字符串中提取 YouTube ID 的代码。注意我只是从 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"
于 2012-11-24T15:11:23.940 回答
1

您可以构建主机名和闭包映射:

$tubes = array(
  'youtube.com' => function($parsed_url) {
    //$parsed_url contains data as returned by parse_url()
  },
  'youtu.be' => function($parsed_url) {
    //
  },
);

然后使用正则表达式解析内容,获取 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地图中即可。

于 2012-11-24T15:01:38.283 回答