正则表达式:从Youtube视频的URL中提取ID

3

我目前正在使用正则表达式代码来分离YT视频ID。我采用正则表达式的原因是yt视频网址有许多格式。我已经构建了一个正则表达式,几乎可以检测到除下面这种YT网址格式之外的所有ID。我尝试修改了它,但没有成功。有没有一种方法可以让正则表达式从下面的URL中剥离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);

1
使用您语言的URL解析函数来读取查询字符串。 - Burhan Khalid
4个回答

3

如何进行字符串操作?您需要找到“v=”并开始读取,直到下一个“&”?这将为您提供视频ID,然后您可以轻松创建URL。


0

我使用这段代码,它适用于我能找到的所有变体:

    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

前一段时间从这篇文章中找到了这个函数。


-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;

这基本上总是以 v= 开头....


因为并非所有的YouTube URL变体都在视频ID之前包含“v =”。 - Mark Stosberg

-1

以下代码应该可以正常工作:

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

它获取以&?开始的任何内容,然后获取ID和下一个&或终止符。

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

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

然后$res将是所需的URL。

谢谢,请问我应该将这段代码放在正则表达式的哪个部分? - user1434156
这就是你需要的正则表达式,只需获取ID即可。在这种情况下,ID将是$2。 - Farid Nouri Neshat
+1 谢谢,但如果想要将ID添加到我的格式化URL的末尾,类似于这样:('(&|\?)v=(\w*)(&|$)','http://www.youtube.com/watch?v=$2',$url); 这样正确吗? - user1434156
我不太懂 PHP,但我可以看出你正在尝试替换字符串。 - Farid Nouri Neshat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接