调整youtube网址以嵌入解析器以删除其他内容

时间:2014-03-28 09:10:57

标签: php regex

我有这个PHP代码可以自动将youtube网址转换为视频:

    $search = '%
    (?:https?://)?
    (?:www\.)?
    (?:
      youtu\.be/
    | youtube\.com
      (?:
        /embed/
      | /v/
      | /watch\?v=
      | /watch\?feature=player_embedded&v=
      )
    )
    ([\w\-]{10,12})
    \b
    %x';

    $replace = "<iframe class=\"youtube-player\" width=\"550\" height=\"385\" src=\"http://www.youtube.com/embed/$1\" data-youtube-id=\"$1\" frameborder=\"0\" allowfullscreen></iframe>";

return preg_replace($search, $replace, $url);

在视频ID之后删除任何内容的最简单方法是什么?

2 个答案:

答案 0 :(得分:0)

哇。建议的链接实际上链接到另一个正则表达式。使用parse_urlparse_str,这就是他们的目的,请参阅this answer。使用正则表达式is hard解析URL并且没有理由重新发明轮子。

答案 1 :(得分:0)

我找到了一种感谢其他人链接的方式,这是一个搜索文本正文并用视频替换所有YouTube链接的功能:

function youtube($body)
{   
    $video_pattern = '~(?:http|https|)(?::\/\/|)(?:www.|)(?:youtu\.be\/|youtube\.com(?:\/embed\/|\/v\/|\/watch\?v=|\/ytscreeningroom\?v=|\/feeds\/api\/videos\/|\/user\S*[^\w\-\s]|\S*[^\w\-\s]))([\w\-]{11})[a-z0-9;:@#?&%=+\/\$_.-]*~i';

    preg_match_all($video_pattern, $body, $matches);
    //print_r($matches[0]);

    foreach ($matches[0] as $url)
    {
        if (strpos($url, 'feature=youtu.be') == TRUE || strpos($url, 'youtu.be') == FALSE ) 
        {
            parse_str(parse_url($url, PHP_URL_QUERY), $id);
            $id = $id['v'];
        } 
        else 
        {
            $id = basename($url);
        }

        $body = str_replace($url, "<iframe class=\"youtube-player\" width=\"550\" height=\"385\" src=\"http://www.youtube.com/embed/{$id}\" data-youtube-id=\"{$id}\" frameborder=\"0\" allowfullscreen></iframe>", $body);
    }

    return $body;
}