PHP中的自动连接或正则表达式

PHP中的自动连接或正则表达式,php,regex,concatenation,Php,Regex,Concatenation,我有一个这样的PHP数组(来自MySQL数据库,YouTube只是一个例子): 现在,我试图实现的是在URL中查找任何匹配项(在本例中:检查URL是否是有效的YouTube URL) 我尝试了以下几点: for($i = 0; $i < count($regexpr); $i++) $regexpr[$i] = preg_quote($regexpr[$i]); // because of the URLs $expr = '/(('. implode('|', $regexpr)

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

现在,我试图实现的是在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);
for($i=0;$i
然而,不幸的是,我无法成功地连接这些表达式-我没有得到任何成功的“点击”

有没有人知道如何解决这个问题

“谢谢

问题是您的源“regexs”:

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

但是,您要通过preg_quote传递这些字符,这将避开任何regex元字符,因此实际上您没有传递任何通配符。您正在传递文字星号、文字句点等

你应该自己跳出正则表达式,跳过preg_quote阶段,例如

http:\/\/.*\.youtube.com\/v\/.*
问题是您的源“regexs”:

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

但是,您要通过preg_quote传递这些字符,这将避开任何regex元字符,因此实际上您没有传递任何通配符。您正在传递文字星号、文字句点等

你应该自己跳出正则表达式,跳过preg_quote阶段,例如

http:\/\/.*\.youtube.com\/v\/.*

如果您解析URL,然后将它们与白名单进行比较,会怎么样?比如:

$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";
}

如果您解析URL,然后将它们与白名单进行比较,会怎么样?比如:

$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";
}

在每次
迭代中发布
$expr
,并更好地输出
preg_quote($regexpr[$i])也是。@webbandit:for()没有括号,所以它只包含preg_quote line.Oh。我明白了<代码>预报价($regexpr[$i])
在每个for迭代和
$expr
中。是的,它只包含转义表达式,我正试图将其连接到一个表达式中,这样我就不必循环preg_match()。发布
var_dump(preg_quote($regexpr[$I])的输出
变量转储($expr)
让我们更了解您的问题。如果没有完整的模式,我们无法测试regexp。请在每次
迭代中发布
$expr
,并更好地输出
preg_quote($regexpr[$i])也是。@webbandit:for()没有括号,所以它只包含preg_quote line.Oh。我明白了<代码>预报价($regexpr[$i])
在每个for迭代和
$expr
中。是的,它只包含转义表达式,我正试图将其连接到一个表达式中,这样我就不必循环preg_match()。发布
var_dump(preg_quote($regexpr[$I])的输出
变量转储($expr)
让我们更了解您的问题。如果没有完整的模式,我们无法测试regexp。这可能是最好的主意。只需提供一个域名数组并使用PHP的parse_url函数是的,这将起作用-非常感谢。然而,这些regex模式组件已经存在,所以我尝试重用它们,而不是通过检查域白名单来重新做。不过,谢谢!:-)这可能是最好的主意。只需提供一个域名数组并使用PHP的parse_url函数是的,这将起作用-非常感谢。然而,这些regex模式组件已经存在,所以我尝试重用它们,而不是通过检查域白名单来重新做。不过,谢谢!:-)哦,是的,你完全正确-我也避开了星号(没有帮助!)。谢谢你指出这一点。你的建议奏效了——谢谢!编辑:我通过转义字符串,然后“手动”反转转义的星号来解决这个问题。这样它仍然可以自动工作。哦,是的,你完全正确-我还避开了星号(没有帮助!)。谢谢你指出这一点。你的建议奏效了——谢谢!编辑:我通过转义字符串,然后“手动”反转转义的星号来解决这个问题。这样它仍然可以自动工作。