PHP:从YouTube网址中提取视频ID

时间:2011-02-01 16:36:39

标签: php regex preg-match-all

我做错了吗? 我需要youtube代码,但它不会返回实际值。

if(preg_match_all("http:\/\/www\.youtube\.com\/v\/(.*)(.*)", $row->n_texto, $matches){
    $code = $image_to_thumb .= "http://i1.ytimg.com/vi/".$matches[1][0]."/0.jpg";
}

编辑 - ircmaxell 根据评论,文字中的链接结构为:

  

http:// www.youtube.com/v/plMvAh10HVg%26hl=en%26fs=1%26rel=0


更新

问题是:我的代码返回如下链接:

http://www.youtube.com/v/plMvAh10HVg%26hl=en%26fs=1%26rel=0

我可以在显示%26hl=en%26fs=1%26rel=0之前使用regexp停止吗?

3 个答案:

答案 0 :(得分:1)

你的正则表达式不正确。它有很多不妥之处。现在,就你想要的而言,试试这个:

#http://(?:.*)youtube.com/v/([^/\#?]+)#

现在,至于为什么,让我们看一下正则表达式:

http://(?:.*)youtube.com

您正在寻找一个以http://开头的字符串,后面有www.ww2.或任何内容的字符串。

/v/

您正在寻找/v/作为网址的开头。

([^/\\#?]+)

您正在查找其他所有其他/,查询字符串(?)或锚点(#)。所以这应该与您正在寻找的ID相匹配。

所以,它会是

if(preg_match("#http://(?:.*)youtube.com/v/([^/\#?]+)#", $row->n_texto, $matches){
    $code = $image_to_thumb .= "http://i1.ytimg.com/vi/".$matches[1]."/0.jpg";
}

如果你想找到所有:

if(preg_match_all("#http://(?:.*)youtube.com/v/([^/\#?]+)#", $row->n_texto, $matches){
    foreach ($matches[1] as $match) {
        $code = $image_to_thumb .= "http://i1.ytimg.com/vi/".$match."/0.jpg";
    }
} 

答案 1 :(得分:0)

所提供的链接在www.youtube.com的第一个w之前有一个空格,您需要的代码是:

if(preg_match_all("%http://www\.youtube\.com/v/([\w]+)%i", $row->n_texto , $matches)){
    $code = $image_to_thumb .= "http://i1.ytimg.com/vi/".$matches[1][0]."/0.jpg";
}

此外,您拥有的网址已经过编码,您可能需要在使用之前使用urldecode($ row-> n_texto)。

答案 2 :(得分:-1)

^http://\w{0,3}.?youtube+\.\w{2,3}/watch\?v=[\w-]{11}

根据http://www.regexlib.com/REDetails.aspx?regexp_id=2569