在PHP中自动连接OR正则表达式

时间:2012-05-28 16:14:56

标签: php regex concatenation

我有一个像这样的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);

然而,遗憾的是,我无法成功连接这些表达式 - 我没有获得任何成功的“点击”。

有人会指出如何解决这个问题吗?

¡格拉西亚斯!

2 个答案:

答案 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";
}