【问题标题】:IPv4 validation using regex使用正则表达式进行 IPv4 验证
【发布时间】: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 方法。在服务器端,这个修饰符肯定不支持

标签: jquery regex asp.net-mvc-4 validation


【解决方案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)  
        } 
        

        【讨论】: