PHP的正则expression式来获得youtubevideoID?

有人可以告诉我如何从URL中获取YouTube的id,而不pipeURL中的其他GETvariables是什么。

以下video为例: http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related : http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related
所以在v=之前和下一个&

使用parse_url()和parse_str() 。

(几乎任何东西都可以使用正则expression式,但是它们很容易出错,所以如果PHP函数专门用于你想要完成的任务,就使用这些函数。)

parse_url接受一个string,并把它切成一个包含一堆信息的数组。 你可以使用这个数组,或者你可以指定你想要的一个项目作为第二个参数。 在这种情况下,我们感兴趣的查询是PHP_URL_QUERY

现在我们有查询,它是v=C4kxS1ksqtw&feature=relate ,但我们只想要在v=之后的部分。 为此,我们转向parse_str ,它基本上像一个string上的GET一样工作。 它接受一个string并创build在string中指定的variables。 在这种情况下,创build$v$feature 。 我们只对$v感兴趣。

为了安全起见,你不想只把parse_url中的所有variables存储在你的名字空间中(见mellowsoon的评论)。 而是将variables存储为数组的元素,以便您可以控制要存储的variables,并且不会意外覆盖现有的variables。

把所有东西放在一起,我们有:

 <?php $url = "http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=relate"; parse_str( parse_url( $url, PHP_URL_QUERY ), $my_array_of_vars ); echo $my_array_of_vars['v']; // Output: C4kxS1ksqtw ?> 

工作示例


编辑:

呵呵 – 谢谢Charles。 这让我发笑,我以前从未见过Zawinski的报价:

Some people, when confronted with a problem, think 'I know, I'll use regular expressions.' Now they have two problems.杰米Zawinski

 preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $url, $matches); 

这将解释

 youtube.com/v/{vidid} youtube.com/vi/{vidid} youtube.com/?v={vidid} youtube.com/?vi={vidid} youtube.com/watch?v={vidid} youtube.com/watch?vi={vidid} youtu.be/{vidid} 

我稍微改进了以支持: http : //www.youtube.com/v/5xADESocujo?feature = autoshare&version = 3&aututide = 1&autoplay = 1

我现在使用的行是:

 preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $link, $matches); 

根据博科对安东尼的回答的评论:

 preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'>]+)/", $url, $matches); 

$matches[1]包含vidid

火柴:

不匹配:

这可以很容易地使用parse_str和parse_url完成,并在我看来更可靠。

我的function支持以下url:

还包括下面的testingfunction。

 /** * Get Youtube video ID from URL * * @param string $url * @return mixed Youtube video ID or FALSE if not found */ function getYoutubeIdFromUrl($url) { $parts = parse_url($url); if(isset($parts['query'])){ parse_str($parts['query'], $qs); if(isset($qs['v'])){ return $qs['v']; }else if(isset($qs['vi'])){ return $qs['vi']; } } if(isset($parts['path'])){ $path = explode('/', trim($parts['path'], '/')); return $path[count($path)-1]; } return false; } // Test $urls = array( 'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player', 'http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player', 'http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player', 'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player', 'http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player', 'http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player', 'http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player', 'http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player' ); foreach($urls as $url){ echo $url . ' : ' . getYoutubeIdFromUrl($url) . "\n"; } 

SOLTUION任何链接types!

 <?php function get_youtube_id_from_url($url) { preg_match('/(http(s|):|)\/\/(www\.|)yout(.*?)\/(embed\/|watch.*?v=|)([a-z_A-Z0-9\-]{11})/i', $url, $results); return $results[6]; } echo get_youtube_id_from_url('http://www.youtube.com/watch?var1=blabla#v=GvJehZx3eQ1$var2=bla'); // or http://youtu.be/GvJehZx3eQ1 // or http://www.youtube.com/embed/GvJehZx3eQ1 // or http://www.youtu.be/GvJehZx3eQ1/blabla?xyz ?> 

输出: GvJehZx3eQ1

看到我build立这个回应的所有回应:

 $links = [ "youtube.com/v/tFad5gHoBjY", "youtube.com/vi/tFad5gHoBjY", "youtube.com/?v=tFad5gHoBjY", "youtube.com/?vi=tFad5gHoBjY", "youtube.com/watch?v=tFad5gHoBjY", "youtube.com/watch?vi=tFad5gHoBjY", "youtu.be/tFad5gHoBjY", "http://youtu.be/qokEYBNWA_0?t=30m26s", "youtube.com/v/vidid", "youtube.com/vi/vidid", "youtube.com/?v=vidid", "youtube.com/?vi=vidid", "youtube.com/watch?v=vidid", "youtube.com/watch?vi=vidid", "youtu.be/vidid", "youtube.com/embed/vidid", "http://youtube.com/v/vidid", "http://www.youtube.com/v/vidid", "https://www.youtube.com/v/vidid", "youtube.com/watch?v=vidid&wtv=wtv", "http://www.youtube.com/watch?dev=inprogress&v=vidid&feature=related" ]; foreach($links as $link){ preg_match("#([\/|\?|&]vi?[\/|=]|youtu\.be\/|embed\/)(\w+)#", $link, $matches); var_dump(end($matches)); } 

我们知道videoID的长度是11个字符,可以在v=vi=v/vi/youtu.be/ 。 所以最简单的方法来做到这一点:

 <?php $youtube = 'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player'; preg_match_all("#(?<=v=|v\/|vi=|vi\/|youtu.be\/)[a-zA-Z0-9_-]{11}#", $youtube, $matches); var_dump($matches[0]); 

并输出:

 array(8) { [0]=> string(11) "dQw4w9WgXcQ" [1]=> string(11) "dQw4w9WgXcQ" [2]=> string(11) "dQw4w9WgXcQ" [3]=> string(11) "dQw4w9WgXcQ" [4]=> string(11) "dQw4w9WgXcQ" [5]=> string(11) "dQw4w9WgXcQ" [6]=> string(11) "dQw4w9WgXcQ" [7]=> string(11) "dQw4w9WgXcQ" } 
 if (preg_match('![?&]{1}v=([^&]+)!', $url . '&', $m)) $video_id = $m[1]; 

我有一些邮件内容,我不得不密码,以获取Youtube ID。 它恰好是以Youtube提供的<iframe>embedded代码的forms。

  <iframe src="http://www.youtube.com/embed/Zpk8pMz_Kgw?rel=0" frameborder="0" width="620" height="360"></iframe> 

我从@rob获得了以下模式。 一旦find匹配,代码片段会执行一个foreach循环,为了获得额外的奖励,我将它与Youtube上的预览图像链接起来。 它可能会匹配更多types的YouTubeembeddedtypes和url:

 $pattern = '#(?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=‌​(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+#'; preg_match_all($pattern, $post_content, $matches); foreach ($matches as $match) { $img = "<img src='http://img.youtube.com/vi/".str_replace('?rel=0','', $match[0])."/0.jpg' />"; break; } 

Rob的个人资料: https : //stackoverflow.com/users/149615/rob

 (?<=\?v=)([a-zA-Z0-9_-]){11} 

这也应该这样做。

 $vid = preg_replace('/^.*(\?|\&)v\=/', '', $url); // Strip all meuk before and including '?v=' or '&v='. $vid = preg_replace('/[^\w\-\_].*$/', '', $vid); // Strip trailing meuk. 

我知道线程的标题是指使用正则expression式,但正如Zawinski的引述所说,我真的认为避免正则expression式在这里是最好的。 我会推荐这个function:

 function get_youtube_id($url) { if (strpos( $url,"v=") !== false) { return substr($url, strpos($url, "v=") + 2, 11); } elseif(strpos( $url,"embed/") !== false) { return substr($url, strpos($url, "embed/") + 6, 11); } } 

我build议这样做,因为YouTubevideo的ID始终是相同的,独立于URL的样式,例如

  • http://www.youtube.com/watch?v=t_uW44Bsezg
  • http://www.youtube.com/watch?feature=endscreen&v=Id3xG4xnOfA&NR=1
  • `和其他Ulr的forms,其中“埋入/”是放在ID之前…!

这可能是embedded式和内嵌框架的东西的情况。