从变量字符串构建if语句

时间:2018-12-19 20:46:06

标签: php

我想根据变量中指定的信息创建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
}

是否可以在我的代码中实现?

2 个答案:

答案 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 
}