让我们以这些URL为例:
- http://www.youtube.com/watch?v=8GqqjVXhfMU&feature=youtube_gdata_player
- http://www.youtube.com/watch?v=8GqqjVXhfMU
这个PHP函数在情况1中不会正确地获取ID,但在情况2中会。案例1非常常见,任何事情都可能出现在YouTube ID后面。
/**
* get YouTube video ID from URL
*
* @param string $url
* @return string YouTube video id or FALSE if none found.
*/
function youtube_id_from_url($url) {
$pattern =
'%^# Match any YouTube URL
(?:https?://)? # Optional scheme. Either http or https
(?:www.)? # Optional www subdomain
(?: # Group host alternatives
youtu.be/ # Either youtu.be,
| youtube.com # or youtube.com
(?: # Group path alternatives
/embed/ # Either /embed/
| /v/ # or /v/
| /watch?v= # or /watch?v=
) # End path alternatives.
) # End host alternatives.
([w-]{10,12}) # Allow 10-12 for 11 char YouTube id.
$%x'
;
$result = preg_match($pattern, $url, $matches);
if (false !== $result) {
return $matches[1];
}
return false;
}
我想的是,一定有一种方法可以让我只查找"v=",无论它在URL中的位置如何,然后取其后面的字符。通过这种方式,将不需要复杂的RegEx。这是基地外的吗?有什么出发点的想法吗?
if (preg_match('/youtube.com/watch?v=([^&?/]+)/', $url, $id)) {
$values = $id[1];
} else if (preg_match('/youtube.com/embed/([^&?/]+)/', $url, $id)) {
$values = $id[1];
} else if (preg_match('/youtube.com/v/([^&?/]+)/', $url, $id)) {
$values = $id[1];
} else if (preg_match('/youtu.be/([^&?/]+)/', $url, $id)) {
$values = $id[1];
}
else if (preg_match('/youtube.com/verify_age?next_url=/watch%3Fv%3D([^&?/]+)/', $url, $id)) {
$values = $id[1];
} else {
// not an youtube video
}
这是我用来从youtube url中提取id的方法。我认为它在所有情况下都有效。
请注意,在结尾$values=id的视频
而不是regex。我强烈推荐parse_url()
和parse_str()
:
$url = "http://www.youtube.com/watch?v=8GqqjVXhfMU&feature=youtube_gdata_player";
parse_str(parse_url( $url, PHP_URL_QUERY ), $vars );
echo $vars['v'];
完成
您可以只使用parse_url
和parse_str
:
$query_string = parse_url($url, PHP_URL_QUERY);
parse_str($query_string);
echo $v;
我使用了以下模式,因为YouTube也有YouTube-nocookie.com域:
'@youtube(?:-nocookie)?.com/watch[#?].*?v=([^"& ]+)@i',
'@youtube(?:-nocookie)?.com/embed/([^"&? ]+)@i',
'@youtube(?:-nocookie)?.com/v/([^"&? ]+)@i',
'@youtube(?:-nocookie)?.com/?v=([^"& ]+)@i',
'@youtu.be/([^"&? ]+)@i',
'@gdata.youtube.com/feeds/api/videos/([^"&? ]+)@i',
在你的情况下,这只意味着用一个可选的(-nookie)来扩展现有的表达式,用于YouTube.com的常规URL,比如:
if (preg_match('/youtube(?:-nocookie).com/watch?v=([^&?/]+)/', $url, $id)) {
如果您将提议的表达式更改为不包含最后的$,它应该可以像您想要的那样工作。我还加了-nocookie。
/**
* get YouTube video ID from URL
*
* @param string $url
* @return string YouTube video id or FALSE if none found.
*/
function youtube_id_from_url($url) {
$pattern =
'%^# Match any YouTube URL
(?:https?://)? # Optional scheme. Either http or https
(?:www.)? # Optional www subdomain
(?: # Group host alternatives
youtu.be/ # Either youtu.be,
|youtube(?:-nocookie)?.com # or youtube.com and youtube-nocookie
(?: # Group path alternatives
/embed/ # Either /embed/
| /v/ # or /v/
| /watch?v= # or /watch?v=
) # End path alternatives.
) # End host alternatives.
([w-]{10,12}) # Allow 10-12 for 11 char YouTube id.
%x'
;
$result = preg_match($pattern, $url, $matches);
if (false !== $result) {
return $matches[1];
}
return false;
}
另一种简单的方法是使用parse_str()
:
<?php
$url = 'http://www.youtube.com/watch?v=8GqqjVXhfMU&feature=youtube_gdata_player';
parse_str($url, $yt);
// The associative array $yt now contains all of the key-value pairs from the querystring (along with the base 'watch' URL, but doesn't seem you need that)
echo $yt['v']; // echos '8GqqjVXhfMU';
?>
parse_url建议很好。如果你真的想要一个正则表达式,你可以使用这个:
/(?<=v=)[^&]+/`
任何青年链接的解决方案:
http://youtube.com/v/dQw4w9WgXcQ
http://youtube.com/watch?v=dQw4w9WgXcQ
http://www.youtube.com/watch?feature=player&v=dQw4w9WgXcQ&var2=bla
http://youtu.be/dQw4w9WgXcQ
===
https://stackoverflow.com/a/20614061/2165415
这里有一个解决方案
/**
* credits goes to: http://stackoverflow.com/questions/11438544/php-regex-for-youtube-video-id
* update: mobile link detection
*/
public function parseYouTubeUrl($url)
{
$pattern = '#^(?:https?://)?(?:www.)?(?:m.)?(?:youtu.be/|youtube.com(?:/embed/|/v/|/watch?v=|/watch?.+&v=))([w-]{11})(?:.+)?$#x';
preg_match($pattern, $url, $matches);
return (isset($matches[1])) ? $matches[1] : false;
}
它也可以处理移动链接。
这是我检索Youtube ID的函数!
function getYouTubeId($url) {
if (!(strpos($url, 'v=') !== false)) return false;
$parse = explode('v=', $url);
$code = $parse[1];
if (strlen($code) < 11) return false;
$code = substr($code, 0, 11);
return $code;
}