【问题标题】:Configure JQ Validate to accept URL without http:// prefix配置 JQ Validate 以接受不带 http:// 前缀的 URL
【发布时间】:2015-04-01 05:26:15
【问题描述】:

我正在使用 Jquery Validate,我需要一个自定义的验证方法。

默认的 URL 方法不会接受 URL,除非它具有架构。我的用户只会提供以 http:// 开头的 URL,所以我不想让他们每次都输入它的麻烦。

我正在尝试创建一个验证方法,该方法将使用默认 URL 方法来检查 URL 的有效性。如果失败,我想添加 http:// 并再次运行它。到目前为止,这是我所拥有的:

addCustomUrlValidator: function () {
    $.validator.addMethod("short-url", function(value, element) {

        if (value.length == 0) return true;  // the field is optional

        // attempt to validate with default URL method.  Return true on valid.
        // ...

        // prepend http:// to value and attempt validation again.  Return true on valid.
        // ...

        return false

    }, jQuery.validator.format("Must be a valid URL format"));
}

【问题讨论】:

  • 您无法使用.addMethod() 更改字段值。您只能输出一个真/假来表示此自定义规则的通过/失败。
  • 要创建这个新方法,请查看the plugin source 中的url 方法,将其正则表达式复制到您的.addMethod() 函数中并对其进行调整以忽略协议...在这种情况下只需删除正则表达式的(https?|s?ftp):\/\/ 部分。
  • 谢谢 Sparky,如果你把它写成答案,我会接受它

标签: jquery regex jquery-validate


【解决方案1】:

我正在使用 Jquery Validate,我需要一个自定义的验证方法。

请参阅the .addMethod() method documentation,了解我们如何在下面执行此操作。

默认的 URL 方法不会接受 URL,除非它具有架构。我的用户只会提供以http:// 开头的 URL,所以我不想让他们每次都输入它的麻烦。

我从默认的url 方法inside the plugin 复制了函数本身并编辑了正则表达式,这样您就不需要URI 方案了。 (我只是删除了正则表达式中的 (https?|s?ftp):\/\/ 部分。) 请注意,这条新规则称为 my_url,您可以将其更改为您想要的任何内容。

jQuery.validator.addMethod('my_url', function( value, element ) {
    // contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/
    return this.optional( element ) || /^(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test( value );
}, 'Please enter a valid url without the "http".');

如果失败,我想在前面加上http:// 并再次运行它。

在提交表单后,您应该在服务器端操作数据。您应该只从自定义方法中返回truefalse,而不是操作任何数据,也不应该以编程方式多次强制相同的数据通过相同的规则。用户输入了正确的格式,或者他没有输入正确的格式……然后用户再试一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 2015-06-08
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多