2011-04-13 102 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