我有以下代码来抓取存储在字符串变量中的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网址?
答案 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)以匹配它们。