2011-02-01 204 views
0

难道我做错了什么? 我需要youtube代码,但它不会返回实际值。PHP:从YouTube网址提取视频ID

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

+0

链接,您提供的是不是一个有效的链接。即使你urldecode它,它仍然会是`plMvAh10HVg&HL = EN&FS = 1的rel = 0`这不是一个有效的URL(它应该有一个`?`之前的第一个`和`位)... – ircmaxell 2011-02-01 17:08:39

+0

灿” t youtube links be watch?v = blah以及?如果您只查看/ v/blah链接,只需使用parse_url获取路径并在开始处删除/ v即可。 – 2011-02-01 17:14:16

回答

1

你的正则表达式是不正确的。它有不止几个错误。现在,只要你想要的东西,试试这个:

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

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

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

您正在寻找与http://开头的字符串,之后有什么(www.,ww2.,或什么也没有)。

/v/ 

您在寻找/v/作为URL的开头。

([^/\\#?]+) 

您正在寻找一切到另一个/,查询字符串(?)或一个锚(#)。所以这应该匹配你正在寻找的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"; 
    } 
} 
+0

Strenge,它返回一条消息: – Klauzito 2011-02-01 16:44:21

0

提供的链接有1前W空间在www.youtube.com,你需要的代码是:

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($按行> n_texto)。