我需要验证来自文本区域的输入。这很复杂,我无法弄清楚如何才能做到最好?你们可以帮忙吗?
来自文本区域的输入基本上是主机名或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) {
}
我无法继续进行。请帮忙。
谢谢戴夫
如果您不介意验证有些松懈,则可以执行以下简单操作:
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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句