[英]PHP function to validate IPv4 and IPv6 using regex
I'm needing to create a function for IPv4 and v6 that I cause use local ip's as well.我需要为 IPv4 和 v6 创建一个 function,我也使用本地 ip。
What I know is a valid IPv4 ranges from 0.0.0.0 to 255.255.255.255 What I know of IPv6 is limited however as despite it being around for a while I haven't really looked much into it til today.我所知道的是有效的 IPv4 范围从 0.0.0.0 到 255.255.255.255 我对 IPv6 的了解是有限的,尽管它已经存在了一段时间,但直到今天我还没有真正研究过它。 But I want to future proof the function I am making a little bit while keeping it a bit retro for the time being.
但我想在未来证明 function 我正在制作一点,同时暂时保持它有点复古。 I'm not sure what the valid ranges are for IPv6.
我不确定 IPv6 的有效范围是多少。
Anyway In general what I am thinking is a function to the extent of无论如何总的来说我在想的是一个function的程度
function validateIP($ip, $vSix = NULL)
{
if($vSix !== NULL)
{
if(preg_match([regex-to-validate-ipv6], $ip))
{
return true;
}
else
{
return false;
}
}
if(preg_match([regex-to-validate-ipv4], $ip))
{
return true;
}
else
{
return false;
}
}
my thing is I suck with regex so I have no idea how to write one that will validate v4 or 6. Also a sanity check on the above function concept would be nice as well.我的事情是我很讨厌正则表达式,所以我不知道如何编写一个可以验证 v4 或 6 的正则表达式。另外,对上述 function 概念进行健全性检查也很好。
Check PHP's filter_var
function.检查 PHP 的
filter_var
函数。 It has a number of validators , including IPv4 and IPv6.它有许多验证器,包括 IPv4 和 IPv6。
$isValid = filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
// $isValid can be evaluated as boolean, as it's FALSE if validation fails.
Edit编辑
Please see Natxet's comment on this answer, and Morgon's answer for a better solution.请参阅 Natxet 对此答案的评论,以及 Morgon 的答案以获得更好的解决方案。
Original Answer原答案
You can just use inet_pton .你可以只使用inet_pton 。 It returns false if the IP is not a valid IPv6 or IPv4:
如果 IP 不是有效的 IPv6 或 IPv4,则返回 false:
function validateIP($ip){
return inet_pton($ip) !== false;
}
try尝试
//validates IPv4 and IPv6
$isValid = filter_var($ip, FILTER_VALIDATE_IP);
//validates IPv4
$isValid = filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV4);
//validates IPv6
$isValid = filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV6);
//validates IPv4 and IPv6, excluding reserved and private ranges
$isValid = filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
http://www.php.net/manual/en/filter.filters.validate.php http://www.php.net/manual/en/filter.filters.validate.php
In addition to Morgon and Mark Pro Campos answers:除了 Morgon 和 Mark Pro Campos 的回答:
function is_valid_ip($ip='', $ip_type=''){
$isValid=false;
if($ip_type=='ipv4'){
//validates IPV4
$isValid = filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV4);
}
elseif($ip_type=='ipv6'){
//validates IPV6
$isValid = filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV6);
}
else{
//validates IPV4 and IPV6
$isValid = filter_var($ip, FILTER_VALIDATE_IP);
}
if($isValid == $ip){
$isValid=true;
}
return $isValid;
}
Resources资源
http://php.net/manual/en/function.filter-var.php http://php.net/manual/en/function.filter-var.php
You might want to check into filter_var instead.您可能想改为检查 filter_var。 It has a filter for IP addresses (IPv4 and IPv6): http://us.php.net/manual/en/filter.filters.validate.php
它有一个 IP 地址过滤器(IPv4 和 IPv6): http : //us.php.net/manual/en/filter.filters.validate.php
Try:尝试:
IPv4 IPv4
/^((2[0-4]|1\d|[1-9])?\d|25[0-5])(\.(?1)){3}\z/
IPv6 IPv6
/^(((?=(?>.*?(::))(?!.+\3)))\3?|([\dA-F]{1,4}(\3|:(?!$)|$)|\2))(?4){5}((?4){2}|((2[0-4]|1\d|[1-9])?\d|25[0-5])(\.(?7)){3})\z/i
From: http://home.deds.nl/~aeron/regex/来自: http : //home.deds.nl/~aeron/regex/
Well, i know this question is for php - not explicitly laravel.好吧,我知道这个问题是针对 php - 不是明确的 laravel。
But for the sake of completeness i will post the solution for php laravel.但为了完整起见,我将发布 php laravel 的解决方案。 To check for valid ipv4 or ipv6 addresses use the following code as value in your validation rules array:
要检查有效的 ipv4 或 ipv6 地址,请使用以下代码作为验证规则数组中的值:
// form fieldname to be checked => 'rules ip-separated'
'field1' => 'required|ipv4', // checks for an ipv4 address + field is required
'field2' => 'nullable|ipv4', // checks for an ipv6 address + an empty string is valid as well
function verify_ip ($ip)
{
//ipv4
if(preg_match('#^(\d{1,3}\.){3}\d{1,3}$#', trim($ip))){
return true;
}
//ipv6
if(preg_match('#^(((?=(?>.*?(::))(?!.+\3)))\3?|([\dA-F]{1,4}(\3|:(?!$)|$)|\2))(?4){5}((?4){2}|((2[0-4]|1\d|[1-9])?\d|25[0-5])(\.(?7)){3})$#i', trim($ip))){
return true;
}
return false;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.