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
火柴:
- 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
- https://m.youtube.com/watch?v=vidid
不匹配:
这可以很容易地使用parse_str和parse_url完成,并在我看来更可靠。
我的function支持以下url:
- 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
还包括下面的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式和内嵌框架的东西的情况。