使用正则表达式进行 IPv4 验证
Posted
技术标签:
【中文标题】使用正则表达式进行 IPv4 验证【英文标题】:IPv4 validation using regex 【发布时间】:2014-12-25 02:24:26 【问题描述】:我正在尝试通过不显眼的验证来验证我的表单中的 IPv4 地址。所有其他验证都可以正常工作,但这个可以正常工作。
我这样定义属性模型:
[RegularExpression(ipAdressRegEx, ErrorMessageResourceName = "IPInvalid", ErrorMessageResourceType = typeof(Strings))]
public virtual String IP get; set;
还有我的正则表达式:
private const string ipAdressRegEx = @"/\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/g";
生成的html是这样的:
<input class="k-textbox" data-val="true" data-val-regex="Invalid IP"
data-val-regex-pattern="/\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/g"
id="IP" name="IP" type="text" value="">
<span class="field-validation-valid" data-valmsg-for="IP" data-valmsg-replace="true"></span>
但验证显示错误无效 IP 错误消息,例如到 ip="192.168.1.1"。
如果我在浏览器控制台中输入以下内容:
"192.168.1.1".match(/\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/g)
(使用传递给输入验证的模式)它返回IP,这是正确的。
我不明白为什么在这种情况下不显眼的验证不起作用...
我尝试了不同的模式...
【问题讨论】:
我的猜测是问题出在/g
修饰符上,我相信这是 javascript 特有的。可能是 ASP.NET MVC 验证使用其他方法在客户端进行匹配,而不是您正在测试的 match
方法。在服务器端,这个修饰符肯定不支持
【参考方案1】:
松开您在字符串中指定的斜杠和g
选项。这些是正则表达式的 JavaScript 分隔符。通过 API 传递正则表达式时不需要。
data-val-regex-pattern="\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
【讨论】:
【参考方案2】:你可以创建类似的方法,
private boolean checkIp(String ipValue,String regex)
return ipValue.matches(regex);
checkIp(yourIpValue, "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
+ "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
+ "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\."
+ "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$")
【讨论】:
【参考方案3】:我只是在想,生成的不显眼验证的时髦 html 可能会对客户端和服务器上正则表达式的行为产生一些问题。这是解释并提供一些解决方法的文章
http://blogs.msdn.com/b/tilovell/archive/2013/05/08/regular-expressions-are-different-in-javascript-and-unintrusive-validation.aspx
【讨论】:
【参考方案4】:关注这个
$("#adressIP, #GatewayInp, #SubnetMask").keyup(function()
var input = $(this).val();
console.log(input);
var regex = new RegExp('(([0-9]|[1-9][0-9]|1[0-9]2|2[0-4][0-9]|25[0-5])\.)3([0-9]|[1-9][0-9]|1[0-9]2|2[0-4][0-9]|25[0-5])$');
if (regex.test(input))
console.log("match");
else
console.log("nomatch");
);
【讨论】:
或许可以添加一些解释?【参考方案5】:function ValidateIPaddress(ipaddress)
if (/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(ipaddress))
return (true)
alert("You have entered an invalid IP address!")
return (false)
【讨论】:
以上是关于使用正则表达式进行 IPv4 验证的主要内容,如果未能解决你的问题,请参考以下文章
(替代解决方案)使用正则表达式使用通配符 (*) 验证 IPV4 和 IPV6