2011-04-13 95 views
0

我有一个数组:匹配数组值到URL字符串

$blacklist = array("asdf.com", "fun.com", "url.com"); 

我有一个输入字符串:

$input = "http://asdf.com/asdf/1234/"; 

我想看看是否串$输入$黑名单匹配的任何值。

我该如何做到这一点?

回答

3

听起来一个体面的使用parse_url()

<?php 
    $blacklist = array("asdf.com", "fun.com", "url.com"); 
    $input = "http://asdf.com/asdf/1234/"; 

    $url = parse_url($input); 

    echo (in_array($url['host'], $blacklist) ? '(FAIL)' : '(PASS)') . $url ['host']; 
?> 

输出:

(FAIL)asdf.com 
1

的一种方法是(但我没有测量的性能):

$san = preg_replace($blacklist, '', $input); 

if($san !== $input) { 
    //contained something from the blacklist 
} 

如果输入不包含黑名单任何字符串,字符串将原样返回。

的其他,也许更适合,绝对更有效的方法可能是extract the host part from the input,并创建黑名单作为关联数组:

$blacklist = array(
     "asdf.com" => true, 
     "fun.com" => true, 
     "url.com" => true 
); 

然后测试将O(1)有:

if($blacklist[$host]) { 
    //contained something from the blacklist 
} 
+0

难道你不知道我有多恨倒票没有评论?恐惧我的愤怒! – 2011-04-13 00:20:44

+0

@KingCrunch:是的,第一个或多或少都是黑客。可以说我想到了一种创造性的方式;)关于第二种:PHP中的数组是有序的映射,它们既不是列表也不是集合。因为它必须执行线性搜索,所以'in_array'总是比较慢。这对于小阵列当然是无关的...... – 2011-04-13 00:27:58

+0

数组实现为哈希映射,而不仅仅是映射。但是,在不同的情况下,他们可以被区别对待。例如,你可以使用一个数组作为集合,列表,堆栈,队列或其他。它只是在这里命名,与实现无关。关于'in_array()':干净的代码>微优化 – KingCrunch 2011-04-13 00:39:07

1

使用的foreach是可能是你想达到什么样的最佳解决方案。

$blacklist = array("/asdf\.com/", "/fun\.com/", "/url\.com/"); 

foreach($blacklist as $bl) { 
    if (preg_match($bl, $input)){return true;} 
} 
+0

你是什么'返回'? – drudge 2011-04-13 00:16:43

+0

@jnpcl如果他正在使用功能检查。当然它是可选的。很明显... – 2011-04-13 00:19:32

+0

对于我们这些人来说,提供答案可能是显而易见的,但对OP来说可能并不明显。您的答案“按原样”不起作用,虽然它是一个可行的解决方案,但它需要额外的代码,OP可能无法实现他需要添加的代码。 – drudge 2011-04-13 00:29:01

0

in_array是无用的,因为它搜索确切的字符串。

你通过数组必须循环,并进行搜索

foreach($str in $blacklist) 
{ 
    if(stristr($input, $str)) 
    { 
     //found 
    } 
} 
+1

你应该使用'break'来避免不必要的测试... – 2011-04-13 00:32:43

0

此代码应工作:

$blacklist = array("asdf.com", "fun.com", "url.com"); 
$input = "http://asdf.com/asdf/1234/"; 
if (in_array(parse_url($input,PHP_URL_HOST),$blacklist)) 
    { 
    // The website is in the blacklist. 
    } 
+0

这与@ jnpcl的回答基本相同。没有必要重复答案... -1。 – 2011-04-13 00:30:24