Regex从字符串中获取YouTube URL


Regex to get YouTube URL from string

我有以下代码,用于获取存储在字符串变量中的YouTube URL:

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 URL吗?

像这样的东西应该可以做到:

<?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
)

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

#((?:www'.)?(?:youtube'.com'/(?:watch'?v=|embed'/    )|youtu'.be'/                                )([a-zA-Z0-9-]*))#i
#((?:www'.)?(?:youtube'.com'/(?:watch'?v=|embed'/|v'/)|youtu'.be'/|youtube'-nocookie'.com'/embed'/)([a-zA-Z0-9-]*))#i

问题是当前表达式没有考虑第一个示例中的-nocookie和第二个示例中...com/v/以及末尾的额外字符。

您可以尝试将其更改为类似的内容:((?:www'.)?(?:youtube(?:-nocookie)?'.com'/(?:v'/|watch'?v=|embed'/)|youtu'.be'/)([a-zA-Z0-9?&=_-]*))(此处的示例),以匹配两者。