我有一个像这样的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*
)
现在,我想要实现的是在网址中找到任何匹配项(在这种情况下:检查网址是否是有效的YouTube网址)。
我尝试的是以下内容:
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);
然而,遗憾的是,我无法成功连接这些表达式 - 我没有获得任何成功的“点击”。
有人会指出如何解决这个问题吗?
¡格拉西亚斯!
答案 0 :(得分:3)
问题是你的来源“正则表达式”:
http://*.youtube.com/v/*
^--- ^---
星号是“前一个”字符的零或更多,而不是一般的通配符。因此,您可以使/
字符成为可选字符。你想要的可能是.*
,这是“任何一个或多个角色”
然而,你通过preg_quote传递那些,并且它将逃脱任何正则表达式元字符,所以实际上你没有传递任何通配符。你传递的是字面星号,字面句等...
你应该自己逃避正则表达式并跳过preg_quote阶段,例如
http:\/\/.*\.youtube.com\/v\/.*
答案 1 :(得分: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";
}