我正在尝试将我脚本中的某些网址列入黑名单。我想基于主URL阻止所有子域,子文件夹(www和非www版本)等。即...
subdomain.baddomain.com
baddomain.com/subfolder/file.php
www.baddomain.com/subfolder/file.php
正则表达式最好吗?如果是这样,怎么样?
答案 0 :(得分:3)
以下应该可以解决问题:
if(in_array(parse_url($url, PHP_URL_HOST), $blacklist)) {
//blacklisted addr
}
答案 1 :(得分:1)
Corbin的答案只会阻止明确的匹配,这意味着您必须输入要阻止的每个域/子域组合。如果您只有两个域名,例如“www.domain.com”& “domain.com”。如果你有数十,数百或数千,那将是一个真正的头痛。这个函数更加健壮,因为它检查被禁域名字符串是否在域名的任何部分,它也更慢:)。
$bannedDomains = array('banned.com') // blocks top level & subdomains.
function bannedDomain($url, $bannedDomains) {
$domain = parse_url($url, PHP_HOST_URL);
foreach($bannedDomains as $bannedDomain) {
if (strpos($domain, $bannedDomain) !== false) {
return true;
}
}
return false;
}
这里也有一个警告,因为它是盲字符串匹配,因此有可能让某人像“www.banned.com.notbanned.com”这样的域名作为域名,因为禁止的域名字符串是在该域内,您最终会阻止有效的域名。域匹配&鉴于各种TLD和&那里的子域名。
此外,如果您只使用显式匹配,那么将域用作关联数组中的键更有效率。然后使用isset()来检测它们是否存在于您的禁止列表中。
$bannedDomains = array(
'www.banned.com' => true,
'banned.com' => true
);
function bannedDomain($url, $bannedDomains) {
$domain = parse_url($url, PHP_HOST_URL);
return isset($bannedDomains[$domain]);
}
如果你真的需要一个超级健壮的系统,那么最好在数据库中使用查找或使用HTTP服务器的功能。
答案 2 :(得分:0)
您不需要正则表达式,需要strpos()
。