我想根据变量中指定的信息创建if(){}
语句。
我当前的代码是通过foreach循环创建字符串的,我试图过滤掉代码中的IP地址,避免将其输入到数据库中。
创建字符串的代码:
//Set excluded IP's
$exclude = "10.1.1.0/24, 192.168.1.0/24";
//Convert excluded to ranges
$ranges = cidrToRange($exclude);
//Build IP address exclusion if statement
$statement = NULL;
foreach($ranges as $ip_ranges) {
$statement .= " !((".ip2long($ip_ranges['start'])." <= $ip_address) && ($ip_dst <= ".ip2long($ip_ranges['end']).")) AND ";
}
//Strip and at end
$statement = rtrim($statement, "AND ");
之后需要将$ip_address
变量插入if语句中(脚本中的后面)
此代码的$statement
输出具有$exclude
变量中指定的值,将输出:
!((167837952 <= $ip_address) && ($ip_address <= 167838207)) AND !((3232235776 <= $ip_address) && ($ip_address <= 3232236031))
我想在if语句中使用该字符串,因此最终结果应类似于:
if(!((167837952 <= $ip_address) && ($ip_address <= 167838207)) AND !((3232235776 <= $ip_address) && ($ip_address <= 3232236031))) {
//Do this
}
是否可以在我的代码中实现?
答案 0 :(得分:0)
构建动态if
语句是一回事,测试它是另一回事。一个简单的替代方法是仅搜索列表,然后检查IP地址是否在范围内。这会检查每个项目,并且一旦匹配就会停止并且$save
为假。
//Convert excluded to ranges
$ranges = cidrToRange($exclude);
// Check if IP is to be saved -
$save = true;
foreach ( $ranges as $ip_ranges) {
if ( $ip_ranges['start'] <= $ip_address && $ip_address <= $ip_ranges['end'] ) {
$save = false;
break;
}
}
这假设$ip_address
也是一个长字符串,而不是字符串,例如...
$ip_address = ip2long("10.10.0.1");
答案 1 :(得分:0)
我想出了一种方法来做我想要的
我的代码
//Check if IP address is in a range
function check_ip_range($ip_address, $ip_ranges){
$ip_address = ip2long($ip_address);
foreach($ip_ranges as $ranges) {
if((ip2long($ranges['start']) <= $ip_address && $ip_address <= ip2long($ranges['end']))) {
//echo long2ip($ip_address)." is between ".$ranges['start']." and ".$ranges['end']."<br>";
return(true);
}
}
return(false);
}
我现在在我的脚本中输入如下代码:
//Configure ranges to exclude from accounting
$config['accounting']['exclude'] = "10.0.0.0/8";
//Convert ranges to array start and end
$exclude_ranges = cidrToRange($config['accounting']['exclude']);
//If IP is not in range
if(!check_ip_range($ip_address, $exclude_ranges)) {
//Do this
}