1

我需要验证来自文本区域的输入。它很复杂,我无法弄清楚如何才能做到最好?你们能帮忙吗?

来自文本区域的输入基本上是主机名或 ips。输入可以是以下任何格式:

x.x.x.x (single IP)
x.x.x.x-x.x.x.x (range of IPs)
x.x.x.x/x.x.x.x (IP and mask)
x.x.x.x/xx (IP and CIDR)
URL (with or without http:// and https:// prefixes)
domain name in format: xxxxxxx.xxx

也可以给出多个值,例如:192.168.1.1 192.168.1.2/192.168.1.4

我可以使用以下代码获取文本框的行:

$text = trim($targets);
$textAr = explode("\n", $text);
$textAr = array_filter($textAr, 'trim');

foreach ($textAr as $line) {


} 

我无法继续进行。请帮忙。

谢谢,戴夫

4

1 回答 1

2

如果您不介意在验证时稍微松懈,您可以执行以下简单操作:

function filter_fn($input)
{
    $input = trim($input);
    $regex_ip = '/^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})$/';
    $regex_range = '/^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})-([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})$/';
    $regex_cidr = '/^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,2})$/';
    $regex_sub = '/^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})$/';

    if (filter_var($input, FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => $regex_ip)))) {
        return $input;
    }

    if (preg_match($regex_range, $input)) {
        return $input;
    }

    if (preg_match($regex_cidr, $input)) {
         return $input;
    }

    if (preg_match($regex_sub, $input)) {
        return $input;
    }

    if (filter_var($input, FILTER_VALIDATE_URL)) {
        return $input;
    }

    if (filter_var('http://'.$input, FILTER_VALIDATE_URL)) {
        return $input;
    }

    return false;
}

$textAr = explode("\n", $text);
$textAr = array_filter($textAr, 'trim');
foreach ($textAr as $line) {
    $success = filter_var($line, FILTER_CALLBACK, array('options' => 'filter_fn'));
    if (!$success) {
        // It failed.
    } else {
        // It worked.
    }
} 

请注意,在我的示例中,我将 preg_match 和 filter_var 与 FILTER_VALIDATE_REGEXP 一起使用。在这种情况下两者是相同的,因此第一个 filter_var 可以很容易地替换为:

preg_match($regex_ip, $input)

甚至:

filter_var($input, FILTER_VALIDATE_IP)
于 2013-08-02T11:23:44.870 回答