使用preg_matchparsingYouTubevideoID

我正在尝试使用preg_matchparsingYouTubevideo的url。 我在这个网站上find了一个正则expression式,

(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+ 

如图所示:

替代文字

我的PHP如下,但它不起作用(给未知修饰符'['错误)…

 <? $subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1"; preg_match("(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+", $subject, $matches); print "<pre>"; print_r($matches); print "</pre>"; ?> 

干杯

这个正则expression式从所有可以find的URL中获取ID …可能还有更多,但是我找不到任何地方的引用。 如果遇到这个不匹配,请留下URL的评论,我会尝试更新正则expression式来匹配您的URL。

 if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match)) { $video_id = $match[1]; } 

下面是这个正则expression式匹配的URL的示例:(在给定的URL之后可以有更多的内容被忽略)

它也适用于youtube-nocookie.comurl,上面的选项相同。

它还会从embedded代码中获取URL的ID(包括iframe和object标签)

最好使用parse_urlparse_str来parsingURL和查询string:

 $subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1"; $url = parse_url($subject); parse_str($url['query'], $query); var_dump($query); 

我不得不处理这个问题,我为几个星期前写了一个PHP类,结束了与任何types的string匹配的正则expression式:有或没有URLscheme,有或没有子域,youtube.com URLstring,youtu.beurlstring和处理所有types的参数sorting。 您可以在GitHub上查看它,或者直接复制并粘贴下面的代码块:

 /** * Check if input string is a valid YouTube URL * and try to extract the YouTube Video ID from it. * @author Stephan Schmitz <eyecatchup@gmail.com> * @param $url string The string that shall be checked. * @return mixed Returns YouTube Video ID, or (boolean) false. */ function parse_yturl($url) { $pattern = '#^(?:https?://)?(?:www\.)?(?: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; } 

为了解释正则expression式,这里是一个溢出的版本:

 /** * Check if input string is a valid YouTube URL * and try to extract the YouTube Video ID from it. * @author Stephan Schmitz <eyecatchup@gmail.com> * @param $url string The string that shall be checked. * @return mixed Returns YouTube Video ID, or (boolean) false. */ function parse_yturl($url) { $pattern = '#^(?:https?://)?'; # Optional URL scheme. Either http or https. $pattern .= '(?:www\.)?'; # Optional www subdomain. $pattern .= '(?:'; # Group host alternatives: $pattern .= 'youtu\.be/'; # Either youtu.be, $pattern .= '|youtube\.com'; # or youtube.com $pattern .= '(?:'; # Group path alternatives: $pattern .= '/embed/'; # Either /embed/, $pattern .= '|/v/'; # or /v/, $pattern .= '|/watch\?v='; # or /watch?v=, $pattern .= '|/watch\?.+&v='; # or /watch?other_param&v= $pattern .= ')'; # End path alternatives. $pattern .= ')'; # End host alternatives. $pattern .= '([\w-]{11})'; # 11 characters (Length of Youtube video ids). $pattern .= '(?:.+)?$#x'; # Optional other ending URL parameters. preg_match($pattern, $url, $matches); return (isset($matches[1])) ? $matches[1] : false; } 

我从领导者的回答中完善了正则expression式。 它也抓取所有各种URL的ID,但更准确

 if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[\w\-?&!#=,;]+/[\w\-?&!#=/,;]+/|(?:v|e(?:mbed)?)/|[\w\-?&!#=,;]*[?&]v=)|youtu\.be/)([\w-]{11})(?:[^\w-]|\Z)%i', $url, $match)) { $video_id = $match[1]; } 

此外,它正确处理错误的ID,其中超过11个字符。

http://www.youtube.com/watch?v=0zM3nApSvMgDw3qlxF

使用

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

你忘了逃避斜杠字符。 所以这个应该做这个工作:

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

parsingBBcode的开始参数( https://developers.google.com/youtube/player_parameters#start

例如: [yt]http://www.youtube.com/watch?v=G059ou-7wmo#t=58[/yt]

PHP的正则expression式:

 '#\[yt\]https?://(?:[0-9A-Z-]+\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/ytscreeningroom\?v=|/feeds/api/videos/|/user\S*[^\w\-\s]|\S*[^\w\-\s]))([\w\-]{11})[?=#&+%\w-]*(t=(\d+))?\[/yt\]#Uim' 

更换:

 '<iframe id="ytplayer" type="text/html" width="639" height="360" src="http://www.youtube.com/embed/$1?rel=0&vq=hd1080&start=$3" frameborder="0" allowfullscreen></iframe>' 

我没有看到任何人直接解决PHP错误,所以我会尽力解释。

“未知修饰符”['“错误的原因是您忘了将您的正则expression式包裹在分隔符中。 PHP只是将第一个字符作为分隔符,只要它是非字母数字的,非空白的ASCII字符即可。 所以在你的正则expression式中:

 preg_match("(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+", $subject, $matches); 

PHP认为你的意思是(作为开始分隔符,然后发现它认为是你的结束分隔符,下一个)并假设以下是模式修饰符。 然而,它发现你的第一个模式修饰符,第一个之后的下一个字符)[[显然不是一个有效的模式修饰符,这就是为什么你会得到你所做的错误。

解决方法是简单地将您的正则expression式包裹在分隔符中,并确保正确匹配的正则expression式中的所有分隔符都将被转义。 我喜欢使用~作为分隔符,b / c很less需要匹配正则expression式中的literal〜。

使用下面的代码

 $url = "" // here is url of youtube video $pattern = getPatternFromUrl($url); //this will retun video id function getPatternFromUrl($url) { $url = $url.'&'; $pattern = '/v=(.+?)&+/'; preg_match($pattern, $url, $matches); //echo $matches[1]; die; return ($matches[1]); } 

这对我工作。

 $yout_url='http://www.youtube.com/watch?v=yxYjeNZvICk&blabla=blabla'; $videoid = preg_replace("#[&\?].+$#", "", preg_replace("#http://(?:www\.)?youtu\.?be(?:\.com)?/(embed/|watch\?v=|\?v=|v/|e/|.+/|watch.*v=|)#i", "", $yout_url)); 

正则expression式可能是最好的方法,但更简单的方法就是像这样爆炸URL并限制响应。

 $youtube_url = 'http://www.youtube.com/watch?v=yxYjeNZvICk&blabla=blabla'; $youtube_id = substr(explode("v=", $youtube_url), 0, 7));