PHP版本的IP段驗證類
可以支援段號和星號,支援白名單,黑名單
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
class IpHelper
{ /**
* IP驗證
*
* 如果地址在黑名單中,返回false;
* 如果地址不在黑名單但在白名單中,返回true;
* 如果地址既不在黑名單也不在白名單,視是否是嚴格模式而定,
* 如果是嚴格模式,則當IP不在黑白名單時返回false;反之,返回true
*
* @param string $ip 訪問IP
* @param array $valid_list 白名單
* @param array $invalid_list 黑名單
* @param boolean $is_strict 是否嚴格模式
* @return boolean
*/
public static function checkIP( $ip , $valid_list , $invalid_list = array (), $is_strict =true)
{
$ip_segs = explode ( `.` , $ip );
// 先黑後白
if (! empty ( $invalid_list ))
{
return self::isInSection( $ip_segs , $invalid_list ) ? false : true;
}
if (! empty ( $valid_list ))
{
return self::isInSection( $ip_segs , $valid_list );
}
return $is_strict == true ? false : true;
}
/**
* 判斷某個IP是否在某個網段內
*
* @param array $ip_segs IP分段陣列
* @param array $section_list 指定IP或IP段列表
* @return boolean
*/
public static function isInSection( $ip_segs , $ip_list )
{
foreach ( $ip_list as $key => $val )
{
$ip_str = self::formatIp( $val );
if (! empty ( $ip_str ))
{
$segments = explode ( `.` , $ip_str );
if (self::isValidSegment( $ip_segs , $segments ))
{
return true;
}
}
}
return false;
}
/**
* 格式化IP
*
* @param string $ip IP段或IP地址
* @return mixed
*/
public static function formatIp( $ip )
{
$arr = explode ( `.` , $ip );
$repeat_count = 4 - count ( $arr );
if ( $repeat_count < 0)
{
return false;
}
$ip .= str_repeat ( `.*` , $repeat_count ); // 追加成完整格式
return str_replace ( `*` , `0-255` , $ip ); // 把星號轉換成標準段
}
/**
* 驗證IP是否在合法範圍中
*
* 依次比較每個IP進行判斷,如果全都符合,返回true,有任何不符,返回false
*
* @param array $ip_segs IP分段陣列
* @param array $segments 指定IP或IP段分段陣列
* @return boolean
*/
public static function isValidSegment( $ip_segs , $segments )
{
foreach ( $segments as $key => $val )
{
if ( strstr ( $val , `-` ) !== false)
{
$range = explode ( `-` , $val );
if ( $ip_segs [ $key ] < (int) $range [0] || $ip_segs [ $key ] > (int) $range [1])
{
return false;
}
}
else
{
if ((string) $ip_segs [ $key ] != trim( $val ))
{
return false;
}
}
}
return true;
}
} |
測試:
1
2
3
4
5
6
7
8
9
10
|
$ip1 = "10.237.1.100" ;
$ip2 = "10.237.3.100" ;
$valid_list = array ( "10.237.1-2.*" );
$invalid_list = array ( "10.237.1.100" );
$rs1 = IpHelper::checkIP( $ip1 , $valid_list );
$rs2 = IpHelper::checkIP( $ip2 , $valid_list );
$rs3 = IpHelper::checkIP( $ip1 , $valid_list , $invalid_list );
var_dump( $rs1 );
var_dump( $rs2 );
var_dump( $rs3 );
|
輸出結果:
1
2
3
|
boolean true boolean false boolean false |
本文轉自 ustb80 51CTO部落格,原文連結:http://blog.51cto.com/ustb80/1300037,如需轉載請自行聯絡原作者
相關文章
- Go IP 段範圍校驗Go
- PHP驗證碼PHP
- 身份證驗證工具類
- 驗證代理IP的三種方法
- PHP 驗證身份證號碼PHP
- PHP中的郵箱驗證PHP
- PHP驗證碼的製作PHP
- PHP 身份證精確匹配驗證PHP
- 驗證手機、郵箱、漢字、身份證、URL、IP地址等java程式碼工具類Java
- 一個漂亮的PHP驗證碼PHP
- google的ip段Go
- 聊聊如何驗證線上的版本是符合預期的版本
- PHP行為驗證碼PHP
- PHP--輸入驗證PHP
- php驗證手機號PHP
- PHP驗證碼淺析PHP
- PHP算式驗證碼和漢字驗證碼的實現方法PHP
- C#版本的混合的驗證碼 (轉)C#
- Elasticsearch-PHP 公用類 Laravel 版本ElasticsearchPHPLaravel
- ip格式驗證正規表示式
- 自用驗證類封裝封裝
- php 驗證格式的函式總結PHP函式
- lumen驗證類 實現控制器場景驗證
- 驗證物件是否為空的工具類物件
- .pfx證照檔案的PHP使用——RSA驗證機制PHP
- 伺服器ip的A段B段C段的區別伺服器
- Laravel 驗證類 實現 路由場景驗證 和 控制器場景驗證Laravel路由
- 超簡單的PHP驗證碼識別PHP
- 驗證郵箱和ip格式的正規表示式
- ThinkPHP 類似 AOP 思想的引數驗證PHP
- yandexbot ip 地址段
- 表單驗證工具類ValidationUtils
- 導致代理IP驗證不準確的四種原因
- 6. 自定義容器型別元素驗證,類級別驗證(多欄位聯合驗證)型別
- PHP 攻擊簡訊驗證碼介面PHP
- PHP簡訊驗證碼防刷方案PHP
- php正則驗證手機、郵箱PHP
- PHP表單提交驗證各種方式PHP