我知道这是基本代码,但在某个地方是一个我在下班后无法弄清楚的错误。在blocklist.txt里面有几行IP,它们应该检查是否存在或者给出布尔值true或false out。即使它匹配,我也没有得到布尔值。
function blocklist($ip) {
$blocked = false;
$ipList = file('blocklist.txt', FILE_SKIP_EMPTY_LINES) // ip in array
or exit("Unable to open blocklist file");
foreach ($ipList as $entry) {
if(strpos($entry, $ip)) { // check if ip exist in array
$blocked = true; // set true
break;
}
echo $blocked ? 'true' : 'false';
}
return $blocked;
}
function getUserIP() {
$ip = '';
if (getenv('HTTP_CLIENT_IP'))
$ip = getenv('HTTP_CLIENT_IP');
else if(getenv('HTTP_X_FORWARDED_FOR'))
$ip = getenv('HTTP_X_FORWARDED_FOR');
else
$ip = 'UNKNOWN';
return $ip;
}
blocklist.txt内容
123.45.67.89
464.93.47.37
95.83.46.359
237.8.54.849
答案 0 :(得分:1)
当您从blocklist.txt
变量中的$ipList
解析IP时,会为每个IP添加额外的空间,因此我使用
$ipList
中的每个值中删除了空格
array_map('trim',$ipList)
function blocklist($ip) {
//remove white space from input array
$ip = trim($ip);
$blocked = false;
$ipList = file('blocklist.txt', FILE_SKIP_EMPTY_LINES) // ip in array
or exit("Unable to open blocklist file");
//remove the white space from each value
$ipList = array_map('trim',$ipList);
//Check if IP exist in the array list
if(in_array($ip,$ipList)){
return true;
}else{
return false;
}
}
function getUserIP() {
$ip = '';
if (getenv('HTTP_CLIENT_IP'))
$ip = getenv('HTTP_CLIENT_IP');
else if(getenv('HTTP_X_FORWARDED_FOR'))
$ip = getenv('HTTP_X_FORWARDED_FOR');
else
$ip = 'UNKNOWN';
return $ip;
}
var_dump(blocklist('123.45.67.89')); //output true
答案 1 :(得分:0)
我认为将文件内容分解为数组是不合理的,进行迭代function blocklist($ip){
if(!$ipList=file_get_contents('blocklist.txt')){
exit("Unable to open blocklist file");
}
return preg_match('/\b\Q'.$ip.'\E\b/',$ipList) ? true : false;
}
调用以从每个元素中删除空白,然后扫描新准备的数组以获得相同的值匹配。
有充分的理由不这样做吗?单个函数调用将更有效/更直接。
$ipList
以下是demo,其中包含静态function blocklist($ip){
$ipList='123.45.67.89
464.93.47.12
464.93.47.123
95.83.46.359
237.8.54.849';
// vv-----------vv-Word Boundaries to ensure no extra digits are matched
return preg_match('/\b\Q'.$ip.'\E\b/',$ipList) ? true : false;
// ^^-------^^-Interpret $ip string literally, so dots are not "any character" (only important in extreme fringe cases)
}
var_export(blocklist('464.93.47.123')); // true
var_export(blocklist('464.93.1.123')); // false
字符串:
array_map()
否则,如果您已设置处理数组的心脏,请执行一个提前退出的循环(不是in_array()
,而是function blocklist($ip){
$ipList = file('blocklist.txt', FILE_SKIP_EMPTY_LINES) // ip in array
or exit("Unable to open blocklist file");
foreach ($ipList as $entry) {
if($ip===trim($entry)) { // check if ip value is element value
return true; // set true and early exit
}
}
return false;
}
:
function getUserIP() {
if (getenv('HTTP_CLIENT_IP')) return getenv('HTTP_CLIENT_IP');
if (getenv('HTTP_X_FORWARDED_FOR')) return getenv('HTTP_X_FORWARDED_FOR');
return 'UNKNOWN';
}
此外,可以改进其他功能以使用更简单/更短的语法:
{{1}}