使用正则表达式抓取存储在字符串中的YouTube网址

时间:2015-12-24 15:32:40

标签: regex url youtube

我有一个使用正则表达式并返回一系列YouTube网址的功能。

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

示例:

$html = '<p>hello<a href="https://www.youtube.com/watch?v=7HknMcG2qYo">world</a></p><p>hello<a href="https://youtube.com/watch?v=37373o">world</a></p>';
$urls = getYoutubeUrlsFromString($html);

这适用于以下网址:

https://www.youtube.com/watch?v=KZhJT3COzPc

但它不适用于以下网址:

https://www.youtube.com/embed/VBp7zW9hxZY

如何更改正则表达式以便获取此类型的YouTube网址?

1 个答案:

答案 0 :(得分:2)

这应该允许watch?v=embed/

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

请注意,您还应该转义.com或.be的积分,否则它会接受任何字符:

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