2012-07-20 80 views
5

我目前使用正则表达式代码来分离YT视频ID。我使用正则表达式的原因是yt视频网址在许多格式上有所不同。我已经构建了一个正则表达式,几乎可以检测到除下面一个之外的几乎所有YT URL格式的ID。我试图修改它,但没有运气。有没有办法让正则表达式从下面的URL中删除ID?正则表达式:从URL中剥离Youtube视频的ID

http://www.youtube.com/watch?feature=v-feature&v=317a815FLWQ

正则表达式:

('~https?://(?:[0-9A-Z-]+\.)?(?:youtu\.be/| youtube\.com\S*[^\w\-\s])([\w\-]{11})(?=[^\w\-]|$)(?![?=&+%\w]*(?:[\'"][^<>]*>| </a>))[?=&+%\w]*~ix','http://www.youtube.com/watch?v=$1',$url); 
+0

使用您的语言的URL解析函数来读取查询字符串。 – 2012-07-20 07:03:55

回答

3

怎么样一个字符串操作?你会发现“v =”并开始阅读,直到下一个“&”?这会给你的视频ID,您可以轻松地创建网址后

-1

你为什么不只是

$url = "http://www.youtube.com/watch?feature=v-feature&v=317a815FLWQ&hello=ok"; 
$stop = strlen($url); 
$pos = strpos($url,'v=')+2; 
$x = strpos($url,'&',$pos); 
if($x) 
    { 
    $x = $x - $pos; 
    $stop = $x; 
    } 
$str = substr($url,$pos,$stop); 
echo $str; 

它基本上总是与AV开头= ....

+0

因为并非所有的YouTube网址版本都包含视频ID之前的“v =”。 – 2012-08-29 19:02:16

0

以下应工作:

(&|\?)v=(\w*)(&|$) 

它得到任何与&?,那么ID,然后下一个&或结束时开始。

我不太了解PHP,但我可以看到您正在尝试替换字符串。这不应该完全工作。我认为你应该做的是用下面的内容获得匹配并将其添加到字符串中以构建自己的URL。

preg_match('(&|\?)v=(\w*)(&|$)', $url, $matches); 
$res = 'http://www.youtube.com/watch?v=' + $matches[1] 

然后$ res将URL所需。

+0

谢谢,你能告诉我里面哪个部分的正则表达式可以补充吗? – techAddict82 2012-07-20 07:54:47

+0

这就是你需要获取ID的所有正则表达式。这种情况下的ID是2美元。 – 2012-07-20 08:17:05

+0

+1谢谢你,但如果想添加id到我的格式化网址的末尾,像这样:'('(&| \?)v =(\ w *)(&| $)','http:/ /www.youtube.com/watch?v=$2',$ url);'这是正确的吗? – techAddict82 2012-07-20 16:08:00

0

FYI我用这个代码,适用于所有我能找到的变化:

function getYouTubeId($url) 
    { 
     $pattern = '#^(?:https?://|//)?(?:www\.|m\.)?(?:youtu\.be/|youtube\.com/(?:embed/|v/|watch\?v=|watch\?.+&v=))([\w-]{11})(?![\w-])#'; 
     preg_match($pattern, $url, $matches); 
     return (isset($matches[1])) ? $matches[1] : false; 
    } 

测试了这些变化:

http://www.youtube.com/watch?v=-wtIMTCHWuI 
http://www.youtube.com/v/-wtIMTCHWuI?version=3&autohide=1 
http://youtu.be/-wtIMTCHWuI 
https://www.youtube.com/embed/-wtIMTCHWuI 

最初发现的功能从this post一会儿前。

相关问题