我创建的一个页面允许用户提交IP(所有是IPv4,而不是IPv6),并将%s作为通配符(例如192.168.1。%)。他们还可以提交没有通配符的完整IP。 IP通过常规HTML表单输入发布,类似于<input name=\"ip\" maxlength=\"15\"/>
。
基本上,我只需要检查IP只包含数字,点和百分号(最多两个)。我并不是真的关心人们输入大于255的数字,但我不希望他们每个点都能输出三个以上的数字。
我根本不知道正则表达式,所以我甚至不知道从哪里开始。我知道[0-9]只允许数字0-9,但这可能不会有多大帮助。我应该将$ _POST ['ip']变量拆分为使用点作为分隔符的部分,然后在每个部分上运行正则表达式的东西吗?一次运行它可能更有效率。
答案 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];
}