匹配IP地址的正则表达式

47

我对正则表达式不熟悉,我想使用preg_match函数来判断一个字符串是否是IP地址。

例如,

$string = "10.0.0.1";
preg_match($regex, $string);

应该返回true。那么,$regex应该是什么?


3
你有没有先去谷歌一下?http://www.regular-expressions.info/regexbuddy/ipaccurate.html - Oscar Mederos
4
45.56.78.888 不是一个 IP 地址。 - kapa
@bazmegakapa,是的,我刚意识到,我随意写了它:D但我想你明白我的意思;) - ibrahim
可能是重复的问题:正则表达式匹配主机名或IP地址? - rds
使用正则表达式验证IPv4地址 - jww
3个回答

132

不必要时不要使用正则表达式 :)

$valid = filter_var($string, FILTER_VALIDATE_IP);

虽然如果你真的想要一个正则表达式...

$valid = preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/', $string);

但是该正则表达式仅验证格式,任何八位组的最大值均为无符号字节的最大值,即255

这就是为什么需要IPv6-IPv4地址仅有32位长,而互联网非常流行 :)。


1
filter_var对于::1作为IP地址有效吗? - user2039981
2
获取好的IP正则表达式 > https://dev59.com/vGox5IYBdhLWcg3wf0bl#20270082 - Alban
2
如果你严格地想要一个布尔值返回,可以使用 $valid = (filter_var($string, FILTER_VALIDATE_IP) !== false); - Andy Fleming
@DesignerGuy 我认为最好在前面加上(bool) - alex
@alex — 真的。特别是在这种情况下,可能没问题。只有在变体中要小心,例如可能会得到通过筛选器但仍为假值的值。 - Andy Fleming
显示剩余12条评论

9
/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/

您的示例中应该做的是(其中包含一个不是 IP 地址的字符串)。当然,这只是一个 IPv4 地址。


@alex:那么999.999.999.999也是有效的IP地址吗?? - Pratik Joshi
@PratikCJoshi:原始问题(在我的回答几年后进行了编辑)要求正则表达式匹配最多为3个字符的四个点分隔数字序列。 - Tim Pietzcker
1
这很简单,但没有人想要错误的IP地址。请考虑添加有效的IP地址正则表达式作为答案。看到有人访问此页面时,他们认为会得到有效 IP地址的正则表达式,但他们并没有得到那个正则表达式。谢谢。 - Pratik Joshi

7
/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ 

这将检查完美范围,包括是否有任何4个范围中的一个高于255。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接