有人可以向我展示如何从URL中获取YouTube ID,而不管URL中包含了什么其他GET变量。
以此视频为例:http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related
因此在v=
和下一个&
之间就是YouTube ID。
PHP_URL_QUERY
。v=C4kxS1ksqtw&feature=relate
,但我们只想要v=
后面的部分。为此,我们使用 parse_str
方法,它基本上像字符串上的GET
一样工作。它接受字符串并创建在字符串中指定的变量。在这种情况下,创建了$v
和$feature
。我们只对$v
感兴趣。parse_url
的变量存储在命名空间中(请参见mellowsoon的评论)。相反,请将变量存储为数组的元素,以便您可以控制要存储的变量,而且您不会意外覆盖现有变量。<?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的引言让我笑了,我以前从未见过:
有些人遇到问题时,会想‘我知道,我用正则表达式来解决它。’现在他们有两个问题。
- Jamie Zawinski
parse_url()
在幕后是如何工作的),但这是正确的方法。 - Thomas Owenspreg_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&autohide=1&autoplay=1
现在我使用的行是:
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $link, $matches);
#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=embed/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#
- simonbs(?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+
。http://rubular.com/r/M9PJYcQxRW - Rob$matches
数组,并提供了更多信息,包括视频ID,这对我的项目非常有用。 - cronoklee基于bokor对Anthony回答的评论:
preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user|shorts)\/))([^\?&\"'>]+)/", $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
youtube.com/shorts/vidid
不匹配:
www.facebook.com?wtv=youtube.com/v/vidid
#
添加到结尾捕获组中:preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?#&\"'>]+)/", $url, $matches);
- joshangell/**
* 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";
}
任何链接类型的解决方案!:
<?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
https://www.youtube.com/watch?v=9E6F57s-V7U&ab_channel=Accent%27sWayEnglishwithHadar
的链接,$results[0]
将不包含完整的链接,只包含视频ID之前的部分。这篇文章有所帮助。 - Fabien Snauwaert根据如何验证YouTube视频ID?进行修复。
<?php
$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",
"youtube.com/watch?v=7HCZvhRAk-M"
];
foreach($links as $link){
preg_match("#([\/|\?|&]vi?[\/|=]|youtu\.be\/|embed\/)([a-zA-Z0-9_-]+)#", $link, $matches);
var_dump(end($matches));
}
<?php
// Here is a sample of the URLs this regex matches: (there can be more content after the given URL that will be ignored)
// http://youtu.be/dQw4w9WgXcQ
// http://www.youtube.com/embed/dQw4w9WgXcQ
// http://www.youtube.com/watch?v=dQw4w9WgXcQ
// http://www.youtube.com/?v=dQw4w9WgXcQ
// http://www.youtube.com/v/dQw4w9WgXcQ
// http://www.youtube.com/e/dQw4w9WgXcQ
// http://www.youtube.com/user/username#p/u/11/dQw4w9WgXcQ
// http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/dQw4w9WgXcQ
// http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ
// http://www.youtube.com/?feature=player_embedded&v=dQw4w9WgXcQ
// It also works on the youtube-nocookie.com URL with the same above options.
// It will also pull the ID from the URL in an embed code (both iframe and object tags)
$url = "https://www.youtube.com/watch?v=v2_MLFVdlQM";
preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match);
$youtube_id = $match[1];
echo $youtube_id;
?>
id
,可以使用以下表达式或类似的表达式:(?im)\b(?:https?:\/\/)?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)\/(?:(?:\??v=?i?=?\/?)|watch\?vi?=|watch\?.*?&v=|embed\/|)([A-Z0-9_-]{11})\S*(?=\s|$)
$re = '/(?im)\b(?:https?:\/\/)?(?:w{3}\.)?youtu(?:be)?\.(?:com|be)\/(?:(?:\??v=?i?=?\/?)|watch\?vi?=|watch\?.*?&v=|embed\/|)([A-Z0-9_-]{11})\S*(?=\s|$)/';
$str = 'http://youtube.com/v/tFad5gHoBjY
https://youtube.com/vi/tFad5gHoBjY
http://www.youtube.com/?v=tFad5gHoBjY
http://www.youtube.com/?vi=tFad5gHoBjY
https://www.youtube.com/watch?v=tFad5gHoBjY
youtube.com/watch?vi=tFad5gHoBjY
youtu.be/tFad5gHoBjY
http://youtu.be/qokEYBNWA_0?t=30m26s
youtube.com/v/7HCZvhRAk-M
youtube.com/vi/7HCZvhRAk-M
youtube.com/?v=7HCZvhRAk-M
youtube.com/?vi=7HCZvhRAk-M
youtube.com/watch?v=7HCZvhRAk-M
youtube.com/watch?vi=7HCZvhRAk-M
youtu.be/7HCZvhRAk-M
youtube.com/embed/7HCZvhRAk-M
http://youtube.com/v/7HCZvhRAk-M
http://www.youtube.com/v/7HCZvhRAk-M
https://www.youtube.com/v/7HCZvhRAk-M
youtube.com/watch?v=7HCZvhRAk-M&wtv=wtv
http://www.youtube.com/watch?dev=inprogress&v=7HCZvhRAk-M&feature=related
youtube.com/watch?v=7HCZvhRAk-M
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($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);
array(30) {
[0]=>
array(2) {
[0]=>
string(32) "http://youtube.com/v/tFad5gHoBjY"
[1]=>
string(11) "tFad5gHoBjY"
}
[1]=>
array(2) {
[0]=>
string(34) "https://youtube.com/vi/tFad5gHoBjY"
[1]=>
string(11) "tFad5gHoBjY"
}
[2]=>
array(2) {
[0]=>
string(37) "http://www.youtube.com/?v=tFad5gHoBjY"
[1]=>
string(11) "tFad5gHoBjY"
}
[3]=>
array(2) {
[0]=>
string(38) "http://www.youtube.com/?vi=tFad5gHoBjY"
[1]=>
string(11) "tFad5gHoBjY"
}
[4]=>
array(2) {
[0]=>
string(43) "https://www.youtube.com/watch?v=tFad5gHoBjY"
[1]=>
string(11) "tFad5gHoBjY"
}
[5]=>
array(2) {
[0]=>
string(32) "youtube.com/watch?vi=tFad5gHoBjY"
[1]=>
string(11) "tFad5gHoBjY"
}
[6]=>
array(2) {
[0]=>
string(20) "youtu.be/tFad5gHoBjY"
[1]=>
string(11) "tFad5gHoBjY"
}
[7]=>
array(2) {
[0]=>
string(27) "http://youtu.be/qokEYBNWA_0"
[1]=>
string(11) "qokEYBNWA_0"
}
[8]=>
array(2) {
[0]=>
string(25) "youtube.com/v/7HCZvhRAk-M"
[1]=>
string(11) "7HCZvhRAk-M"
}
[9]=>
array(2) {
[0]=>
string(26) "youtube.com/vi/7HCZvhRAk-M"
[1]=>
string(11) "7HCZvhRAk-M"
}
[10]=>
array(2) {
[0]=>
string(26) "youtube.com/?v=7HCZvhRAk-M"
[1]=>
string(11) "7HCZvhRAk-M"
}
[11]=>
array(2) {
[0]=>
string(27) "youtube.com/?vi=7HCZvhRAk-M"
[1]=>
string(11) "7HCZvhRAk-M"
}
[12]=>
array(2) {
[0]=>
string(31) "youtube.com/watch?v=7HCZvhRAk-M"
[1]=>
string(11) "7HCZvhRAk-M"
}
[13]=>
array(2) {
[0]=>
string(32) "youtube.com/watch?vi=7HCZvhRAk-M"
[1]=>
string(11) "7HCZvhRAk-M"
}
[14]=>
array(2) {
[0]=>
string(20) "youtu.be/7HCZvhRAk-M"
[1]=>
string(11) "7HCZvhRAk-M"
}
[15]=>
array(2) {
[0]=>
string(29) "youtube.com/embed/7HCZvhRAk-M"
[1]=>
string(11) "7HCZvhRAk-M"
}
[16]=>
array(2) {
[0]=>
string(32) "http://youtube.com/v/7HCZvhRAk-M"
[1]=>
string(11) "7HCZvhRAk-M"
}
[17]=>
array(2) {
[0]=>
string(36) "http://www.youtube.com/v/7HCZvhRAk-M"
[1]=>
string(11) "7HCZvhRAk-M"
}
[18]=>
array(2) {
[0]=>
string(37) "https://www.youtube.com/v/7HCZvhRAk-M"
[1]=>
string(11) "7HCZvhRAk-M"
}
[19]=>
array(2) {
[0]=>
string(31) "youtube.com/watch?v=7HCZvhRAk-M"
[1]=>
string(11) "7HCZvhRAk-M"
}
[20]=>
array(2) {
[0]=>
string(57) "http://www.youtube.com/watch?dev=inprogress&v=7HCZvhRAk-M"
[1]=>
string(11) "7HCZvhRAk-M"
}
[21]=>
array(2) {
[0]=>
string(31) "youtube.com/watch?v=7HCZvhRAk-M"
[1]=>
string(11) "7HCZvhRAk-M"
}
[22]=>
array(2) {
[0]=>
string(32) "http://youtube.com/v/dQw4w9WgXcQ"
[1]=>
string(11) "dQw4w9WgXcQ"
}
[23]=>
array(2) {
[0]=>
string(33) "http://youtube.com/vi/dQw4w9WgXcQ"
[1]=>
string(11) "dQw4w9WgXcQ"
}
[24]=>
array(2) {
[0]=>
string(33) "http://youtube.com/?v=dQw4w9WgXcQ"
[1]=>
string(11) "dQw4w9WgXcQ"
}
[25]=>
array(2) {
[0]=>
string(42) "http://www.youtube.com/watch?v=dQw4w9WgXcQ"
[1]=>
string(11) "dQw4w9WgXcQ"
}
[26]=>
array(2) {
[0]=>
string(34) "http://youtube.com/?vi=dQw4w9WgXcQ"
[1]=>
string(11) "dQw4w9WgXcQ"
}
[27]=>
array(2) {
[0]=>
string(38) "http://youtube.com/watch?v=dQw4w9WgXcQ"
[1]=>
string(11) "dQw4w9WgXcQ"
}
[28]=>
array(2) {
[0]=>
string(39) "http://youtube.com/watch?vi=dQw4w9WgXcQ"
[1]=>
string(11) "dQw4w9WgXcQ"
}
[29]=>
array(2) {
[0]=>
string(27) "http://youtu.be/dQw4w9WgXcQ"
[1]=>
string(11) "dQw4w9WgXcQ"
}
}
jex.im将可视化正则表达式:
我们知道视频ID有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"
}
(?<=\?v=)([a-zA-Z0-9_-]){11}
$ch=curl_init(); curl_setopt($ch, CURLOPT_URL, "http://vimeo.com/api/v2/video/$id.php"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); $hash =unserialize(curl_exec($ch)); curl_close($ch);
- jerrygarciuh