正则表达式从字符串获取YouTube URL

时间:2015-12-31 17:08:21

标签: php regex youtube

我有以下代码来抓取存储在字符串变量中的YouTube网址:

function getVideoUrlsFromString($html) {
    $regex = '#((?:www\.)?(?:youtube\.com\/(?:watch\?v=|embed\/)|youtu\.be\/)([a-zA-Z0-9-]*))#i';
    preg_match_all($regex, $html, $matches);
    $matches = array_unique($matches[0]);
    usort($matches, function($a, $b) {
        return strlen($b) - strlen($a);
    });
    return $matches;
}

$html = 'https://www.youtube-nocookie.com/embed/VWrlXsmcL2E';
$html = getVideoUrlsFromString($html);
print_r($html);

但它并不适用:

https://www.youtube-nocookie.com/embed/VWrlXsmcL2E
http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US

有没有办法改变正则表达式以使用这两个常见的YouTube网址?

2 个答案:

答案 0 :(得分:2)

这样的事情可以解决问题:

template<typename T = double>
constexpr T NaN = T(1e+300); //with some changes, apparently having the float overflow

输出:

<?php

function getVideoUrlsFromString($html) {
    $regex = '#((?:www\.)?(?:youtube\.com\/(?:watch\?v=|embed\/|v\/)|youtu\.be\/|youtube\-nocookie\.com\/embed\/)([a-zA-Z0-9-]*))#i';
    preg_match_all($regex, $html, $matches);
    $matches = array_unique($matches[0]);
    usort($matches, function($a, $b) {
        return strlen($b) - strlen($a);
    });
    return $matches;
}

$html = '
    https://www.youtube-nocookie.com/embed/VWrlXsmcL2E
    http://www.youtube.com/v/NLqAF9hrVbY?fs=1&hl=en_US
';
$html = getVideoUrlsFromString($html);
print_r($html);

这是两者的差异,看看添加了什么:

Array
(
    [0] => www.youtube-nocookie.com/embed/VWrlXsmcL2E
    [1] => www.youtube.com/v/NLqAF9hrVbY
)

答案 1 :(得分:0)

问题在于,您当前的表达式没有考虑第一个示例中的-nocookie和第二个中的...com/v/以及最后的额外字符。

您可以尝试将其更改为:((?:www\.)?(?:youtube(?:-nocookie)?\.com\/(?:v\/|watch\?v=|embed\/)|youtu\.be\/)([a-zA-Z0-9?&=_-]*))(示例here)以匹配它们。