RegEx模式,从任何YouTubeurl获取YouTubevideoID

我们以这些URL为例:

  1. http://www.youtube.com/watch?v=8GqqjVXhfMU&feature=youtube_gdata_player
  2. http://www.youtube.com/watch?v=8GqqjVXhfMU

这个PHP函数在情况1中不能正确获得ID,但是在情况2中。情况1非常普遍,其中ANYING可能落后于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; } 

我在想的是,我必须find一种方法,只要find“v =”,不pipe它在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 } 

这是我用来从YouTubeurl中提取的ID。 我认为它适用于所有情况。

请注意,在video的最后$ values = id

而不是正则expression式。 我parse_str()推荐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_urlparse_str

 $query_string = parse_url($url, PHP_URL_QUERY); parse_str($query_string); echo $v; 

另一个简单的方法是使用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的build议是好的。 如果你真的想要一个正则expression式,你可以使用这个:

 /(?<=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', 

在你的情况下,它只是意味着扩展现有的expression式与一个可选的(-nocookie)的常规YouTube.comurl如下所示:

 if (preg_match('/youtube(?:-nocookie)\.com\/watch\?v=([^\&\?\/]+)/', $url, $id)) { 

如果您将build议的expression式更改为不包含最终$,那么它应该按照您的预期工作。 我也加了-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; } 

针对任何YOUTUBE LINK解决scheme:

 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

这是一个解决scheme

 /** * 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; } 

它也可以处理移动链接。

这是我的function检索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; }