如何使用PHP中的正则表达式检查带通配符的IP是否有效?

时间:2012-08-28 02:54:14

标签: php regex

我创建的一个页面允许用户提交IP(所有是IPv4,而不是IPv6),并将%s作为通配符(例如192.168.1。%)。他们还可以提交没有通配符的完整IP。 IP通过常规HTML表单输入发布,类似于<input name=\"ip\" maxlength=\"15\"/>

基本上,我只需要检查IP只包含数字,点和百分号(最多两个)。我并不是真的关心人们输入大于255的数字,但我不希望他们每个点都能输出三个以上的数字。

我根本不知道正则表达式,所以我甚至不知道从哪里开始。我知道[0-9]只允许数字0-9,但这可能不会有多大帮助。我应该将$ _POST ['ip']变量拆分为使用点作为分隔符的部分,然后在每个部分上运行正则表达式的东西吗?一次运行它可能更有效率。

2 个答案:

答案 0 :(得分:1)

虽然您可以使用正则表达式执行此操作,但我相信它会很复杂,而更直接的解决方案是字符串函数和filter_var()的组合。

伪代码

  • substr_count() 通配符以确保最多2个
  • 带有安全数字的
  • str_replace() 通配符,例如50
  • 使用filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)

如果其中任何一个失败,您的IP就会很糟糕。为了教你钓鱼,我会把代码留给你。

答案 1 :(得分:0)

它看起来很难,我知道,但这是我最常用的被RegexBuddy盗取的ip-validation正则表达式,增强了你的&#34;百分比字符&#34; ... 因为你想用它进行验证,所有简单的正则表达式都是如此。不会在这里工作,因为&#39;匹配&#34; 999.345.465.123&#34;也是......

让我知道,如果它正在工作......

if (preg_match('/(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]|%)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]|%)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]|%)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]|%)/i', $_GET['ip'], $regs)) {
    // full validated ip
    $ip = $regs[0];

    // address octets directly?
    $first = $regs[1];
    $second = $regs[2];
    $third = $regs[3];
    $fourth = $regs[4];
}