2013-08-02 196 views
1

我需要驗證來自文本區域的輸入。 這是複雜的,我無法弄清楚我怎麼能做到最好? 你們能幫忙嗎?Php複合驗證邏輯

來自文本區域的輸入基本上是主機名或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

使用[filter_var(HTTP://www.php。 net/manual/en/filter.filters.validate.php) – AD7six

+1

你也可以使用這個偉大的lib https://github.com/Respect/Validation – Nicklasos

+0

@sash你爲什麼刪除我的答案。我只是想幫助 – sash

回答

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) 
+0

非常感謝。當你說'如果我在驗證時略有鬆動',你是什麼意思?當這不起作用時,你能建議我嗎? – sash

+0

例如,如果您想驗證ipv4地址實際上是否有效,那麼您仍然需要多一點驗證。例如這將通過555.555.555.555,所以你需要額外的約束。這真的取決於你的使用情況,這是否會起作用。就目前來看,這是非常基礎的,並且可以用於簡單驗證。 – Michael