0

我有一个这样的 PHP 数组(来自 MySQL 数据库,YouTube 只是一个例子):

[regexpr] => array(4) (
   [0] => (string) http://*.youtube.com/v/*
   [1] => (string) https://*.youtube.com/v/*
   [2] => (string) http://youtu.be/*
   [3] => (string) http://m.youtube.com/watch*
)

现在,我想要实现的是在 URL 中找到任何匹配项(在这种情况下:检查 URL 是否是有效的 YouTube URL)。

我尝试过的是以下内容:

for($i = 0; $i < count($regexpr); $i++)
   $regexpr[$i] = preg_quote($regexpr[$i]); // because of the URLs

$expr = '/(('. implode('|', $regexpr) . '))/i'; // Concatenating the ORs

$found = preg_match($expr, 'http://www.youtube.com/[foo]&v=MyVidID', $matches);

然而,不幸的是,我无法成功地连接这些表达式——我没有得到任何成功的“命中”。

有人能指点一下如何解决这个问题吗?

¡ 谢天谢地!

4

2 回答 2

3

问题是您的来源“正则表达式”:

http://*.youtube.com/v/*
       ^---            ^---

星号是“零个或多个前一个”字符,而不是通用通配符。因此,您正在使/字符成为可选的。你想要的可能.*是“零个或多个任意字符”

但是,您通过 preg_quote 传递它们,这将转义任何正则表达式元字符,因此实际上您没有传递任何通配符。您正在传递文字星号、文字句点等...

您应该自己逃避正则表达式并跳过 preg_quote 阶段,例如

http:\/\/.*\.youtube.com\/v\/.*
于 2012-05-28T16:19:31.463 回答
2

如果您解析网址然后将它们与白名单进行比较会怎样?就像是:

$myurls= array('http://example.com', 'http://foo.com/', 'http://mysite.com/', 'http://youtube.com?feeble=2&blob=ixls');
$whitelist=array('foo.com', 'youtube.com');

foreach($myurls as $url){
    $parsed=parse_url($url);
    if(in_array($parsed['host'],$whitelist)) echo "$url OK";
}
于 2012-05-28T16:28:48.907 回答