5

我目前正在使用正则表达式代码来分隔 YT 视频 ID。我使用正则表达式的原因是 yt 视频 URL 有多种格式。我已经构建了一个正则表达式,它几乎可以检测除以下格式之外的几乎所有 YT url 格式的 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);
4

4 回答 4

3

字符串操作怎么样?你会找到 "v=" 并开始阅读直到下一个 "&" 吗?这将为您提供视频 ID,您可以稍后轻松创建 URL

于 2012-07-20T06:56:12.230 回答
0

以下应该有效:

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

&它获取以or开头的任何内容?,然后是 id ,然后是下一个&或结尾。

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

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

然后 $res 将是想要的 URL。

于 2012-07-20T07:05:29.277 回答
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

前一阵子从这篇帖子中找到了这个功能。

于 2016-05-25T22:50:20.703 回答
-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= ... 开头。

于 2012-07-20T07:01:46.247 回答