使用strpos()匹配数组的一部分,PHP

时间:2012-10-11 02:22:19

标签: php strpos

我需要一些关于strpos()的帮助。

需要构建匹配包含/apple-touch的任何网址的方法,但也需要保持匹配的细节,例如"/favicon.gif"

目前,匹配作为数组的一部分单独列出:

<?php 

$errorurl = $_SERVER['REQUEST_URI'];
$blacklist = array("/favicon.gif", "/favicon.png", "/apple-touch-icon-precomposed.png", "/apple-touch-icon.png", "/apple-touch-icon-72x72-precomposed.png", "/apple-touch-icon-72x72.png", "/apple-touch-icon-114x114-precomposed.png", "/apple-touch-icon-114x114.png", "/apple-touch-icon-57x57-precomposed.png", "/apple-touch-icon-57x57.png", "/crossdomain.xml");

 if (in_array($errorurl, $blacklist)) { // do nothing }
    else { // send an email about error }

?>

有什么想法吗?

非常感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您可以使用str_replace删除所有出现的黑名单项,而不是正则表达式,并将新字符串与旧字符串进行比较:

if ( str_replace($blacklist, '', $errorurl) !== $errorurl )
{
  // do nothing
}
else
{
  // send an email about error
}

答案 1 :(得分:0)

如果你想为此使用正则表达式,并且你想要一个正则表达式字符串,它将捕获现有黑名单中的所有值,并且匹配任何apple-touch字符串,那么这样的事情就可以了。

if(preg_match('/^\/(favicon|crossdomain|apple-touch.*)\.(gif|png|xml)$/',$_SERVER['REQUEST_URI']) {
    //matched the blacklist!
}

老实说,这比你需要的要复杂得多。

我会说你最好在你已经拥有的黑名单数组中保留像favicon.gif等特定值;当你在列表中添加更多项目时,它会变得更容易。

我只考虑将{regex}用于apple-touch值,因为您要阻止它们的任何变体。但即便如此,如果你使用strpos(),它可能会更简单。