2014-03-28 55 views
0

我有这样的PHP代码自动打开YouTube网址到视频:调整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后什么最简单的方法?

+0

请提供输出的一个例子,你想达到 – Sharky

+0

一你使用的是最好的方法。这正在考虑几乎所有你可以获得的youtube网址。 – aelor

+0

可能重复的http://stackoverflow.com/questions/15218718/get-youtube-id-for-all-url-types –

回答

0

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

+0

我没有直接放入链接,而是从更大的文本中抓取它,所以我不能只是parse_url它。 – NaughtySquid

+0

@LiamDawe - 好吧,这样更有意义,你可以在你的问题中提一提吗?我仍然会建议寻找URL的“轻量级”正则表达式,然后使用parse_url,但那真是你的号召。举例来说,根据你找到URL的位置,你可能需要比'\?v ='和'\?feature = ...&v ='更匹配,你需要相应地改变你的正则表达式。 '/ v /?foo = bar&v ='也是一个有效的YouTube网址。 – Claudiu

+0

添加了我自己的答案:) – NaughtySquid

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; 
}