【问题标题】:Regex to match an IP address [closed]正则表达式匹配 IP 地址 [关闭]
【发布时间】:2011-08-17 11:21:15
【问题描述】:

我是正则表达式的新手,我想使用 preg_match 函数来查找字符串是否为 IP 地址。

例如,

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

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

【问题讨论】:

标签: php regex string ip preg-match


【解决方案1】:

当你不需要时不要使用正则表达式:)

$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 位长,而且互联网很流行 :)

【讨论】:

  • filter_var 是否适用于 ::1 作为 IP?
  • \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
  • 或者$valid = (filter_var($string, FILTER_VALIDATE_IP) !== false);,如果你严格想要一个布尔值。
  • @DesignerGuy 我认为只是在它前面加上 (bool) 会更好。
【解决方案2】:
/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/

应该为你的例子做(它包含一个字符串,不是一个IP地址)。当然,它只是一个 IPv4 地址。

【讨论】:

  • @alex : 那么 999.999.999.999 也将是有效 IP !!??
  • @PratikCJoshi:最初的问题(在我回答多年后已被编辑)要求一个正则表达式,它可以匹配任何由四个点分隔的数字组成的序列,每个数字最多 3 个字符......跨度>
  • 这很简单,但没有人会想要错误的 IP 地址。请考虑添加有效的 IP 地址正则表达式作为答案。看到人们来到此页面,认为他们会获得 有效 IP 地址的正则表达式,但他们没有获得该正则表达式。谢谢
【解决方案3】:
/^(?:(?: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。

【讨论】:

    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 2011-08-27
    • 2012-05-17
    • 2011-03-01
    • 2014-05-17
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多