我有以下代码,用于获取存储在字符串变量中的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?&=_-]*))
(此处的示例),以匹配两者。