2011-02-01 252 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)。