我有一个数组:匹配数组值到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