正則
想用一條正則來匹配IP地址,這樣寫^192\.168\.[0-255]+\.[0-255]$
但是是錯誤的!
正則 []
不是可以限制 [0-9a-z]
卻無法限制 [0-255]
嗎
回複內容:
正則
想用一條正則來匹配IP地址,這樣寫^192\.168\.[0-255]+\.[0-255]$
但是是錯誤的!
正則 []
不是可以限制 [0-9a-z]
卻無法限制 [0-255]
嗎
服了
filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
==============編輯一下,答案跑題了,其實我本來就是想介紹一下這個函數=============
function isPrivateIP($ip) { return !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);}
/** * 判斷內網IP * * @param $ip * * @returns */public function isInternalIp($ip) { $ip = ip2long($ip); $net_a = ip2long('10.255.255.255') >> 24; //A類網預留ip的網路地址 $net_b = ip2long('172.31.255.255') >> 20; //B類網預留ip的網路地址 $net_c = ip2long('192.168.255.255') >> 16; //C類網預留ip的網路地址 return $ip >> 24 === $net_a || $ip >> 20 === $net_b || $ip >> 16 === $net_c;}
$long = ip2long($ip)if ($long == -1 || $long === FALSE) { echo 'Invalid IP, please try again';}else{ //if $long在你需要的範圍即可。}
25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]
[0-9]可以,但是不能[0-10]。因為[]
本身就是指的只匹配其中一個。長度只能為1.
……我很好奇你這個的應用情境。
- IP地址需要配合子網路遮罩輔助確定是否屬於同一內網。
- IP地址可能整體表示為一個十進位整數。如果本機裝有http伺服器,歡迎訪問http://2130706433/,有驚喜。
- IPv6也是個問題。
正則不應當用於IP地址的詳細驗證。有很多問題用正則來解決就是求死之道。就比如正則匹配XML/JSON。我贊成用正則粗略的找出一個“可能是IP地址”的子串,但對於IP地址的進一步驗證,推薦題主該怎麼來就怎麼來。
例如如果僅應對一般格式的IPv4地址,其實建議匹配(?:(\d{1,3})\.)(\d{1,3})
,篩出IP地址的四個數之後再另寫程式檢查之。
^192\.168\.1?[0-9]{1,2}\.1?[0-9]{1,2}$
可以用這個驗證: http://jex.im/regulex/#!embed=false&flags=&re=%5E(a%7Cb)*%3F%24