0

我制作的一个页面允许用户使用 % 作为通配符(例如 192.168.1.%)提交 IP(全部是 IPv4,而不是 IPv6)。他们还可以提交不带通配符的完整 IP。IP 通过常规 HTML 表单输入发布,例如<input name=\"ip\" maxlength=\"15\"/>.

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

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

4

2 回答 2

1

虽然您可以使用正则表达式来做到这一点,但我相信它会很复杂,更直接的解决方案是字符串函数和filter_var().

伪代码

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

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

于 2012-08-28T02:59:50.730 回答
0

我知道,它看起来很难,但这是我最常用的 ip-validation 正则表达式,被 RegexBuddy 窃取,用你的“百分比字符”增强......因为你想用它来验证,所有简单的正则表达式都行不通在这里,因为'将匹配“999.345.465.123”,太......

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

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];
}
于 2012-08-28T03:11:48.310 回答