我有一個數組:匹配數組值到URL字符串
$blacklist = array("asdf.com", "fun.com", "url.com");
我有一個輸入字符串:
$input = "http://asdf.com/asdf/1234/";
我想看看是否串$輸入$黑名單匹配的任何值。
我該如何做到這一點?
我有一個數組:匹配數組值到URL字符串
$blacklist = array("asdf.com", "fun.com", "url.com");
我有一個輸入字符串:
$input = "http://asdf.com/asdf/1234/";
我想看看是否串$輸入$黑名單匹配的任何值。
我該如何做到這一點?
聽起來一個體面的使用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
的一種方法是(但我沒有測量的性能):
$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
}
使用的foreach是可能是你想達到什麼樣的最佳解決方案。
$blacklist = array("/asdf\.com/", "/fun\.com/", "/url\.com/");
foreach($blacklist as $bl) {
if (preg_match($bl, $input)){return true;}
}
in_array是無用的,因爲它搜索確切的字符串。
你通過數組必須循環,並進行搜索
foreach($str in $blacklist)
{
if(stristr($input, $str))
{
//found
}
}
你應該使用'break'來避免不必要的測試... – 2011-04-13 00:32:43
此代碼應工作:
$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.
}
這與@ jnpcl的回答基本相同。沒有必要重複答案... -1。 – 2011-04-13 00:30:24
難道你不知道我有多恨倒票沒有評論?恐懼我的憤怒! – 2011-04-13 00:20:44
@KingCrunch:是的,第一個或多或少都是黑客。可以說我想到了一種創造性的方式;)關於第二種:PHP中的數組是有序的映射,它們既不是列表也不是集合。因爲它必須執行線性搜索,所以'in_array'總是比較慢。這對於小陣列當然是無關的...... – 2011-04-13 00:27:58
數組實現爲哈希映射,而不僅僅是映射。但是,在不同的情況下,他們可以被區別對待。例如,你可以使用一個數組作爲集合,列表,堆棧,隊列或其他。它只是在這裏命名,與實現無關。關於'in_array()':乾淨的代碼>微優化 – KingCrunch 2011-04-13 00:39:07