25

我想验证电话号码,如 (123) 456-7890 或 1234567890 应该如何在以下代码中编写“匹配”条件?

form.validate({

    rules: {

       phoneNumber: {matches:"[0-9]+",minlength:10, maxlength:10}
4

9 回答 9

32

你的正则表达式应该是这样的

[0-9\-\(\)\s]+.

它匹配数字、破折号、括号和空格。

如果你需要更严格的东西,只匹配你的例子,试试这个:

([0-9]{10})|(\([0-9]{3}\)\s+[0-9]{3}\-[0-9]{4})

于 2013-11-07T15:55:33.223 回答
27

你的代码:

rules: {
    phoneNumber: {
        matches: "[0-9]+",  // <-- no such method called "matches"!
        minlength:10,
        maxlength:10
    }
}

在 jQuery Validate 插件matches中的任何地方都没有调用这样的回调函数、选项、方法或规则。编辑:OP没有提到这matches是他的自定义方法。

但是,在文件additional-methods.js,您可以使用多种电话号码验证方法。被调用的phoneUS应该满足您的模式。由于该规则已经验证了长度,minlength因此maxlength是多余的。区号和前缀不能以 . 开头,这也更加全面1

rules: {
    phoneNumber: {
        phoneUS: true
    }
}

演示:http: //jsfiddle.net/eWhkv/


如果出于某种原因,您只需要在另一种方法中使用正则表达式,您可以从这里获取它...

jQuery.validator.addMethod("phoneUS", function(phone_number, element) {
    phone_number = phone_number.replace(/\s+/g, "");
    return this.optional(element) || phone_number.length > 9 && 
    phone_number.match(/^(\+?1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/);
}, "Please specify a valid phone number");
于 2013-11-07T16:15:19.747 回答
18
function validatePhone(txtPhone) {
    var a = document.getElementById(txtPhone).value;
    var filter = /^((\+[1-9]{1,4}[ \-]*)|(\([0-9]{2,3}\)[ \-]*)|([0-9]{2,4})[ \-]*)*?[0-9]{3,4}?[ \-]*[0-9]{3,4}?$/;
    if (filter.test(a)) {
        return true;
    }
    else {
        return false;
    }
}

演示 http://jsfiddle.net/dishandd/JLJMW/496/

于 2014-03-17T05:41:17.357 回答
16
/\(?([0-9]{3})\)?([ .-]?)([0-9]{3})\2([0-9]{4})/

支持:

  • (123) 456 7899
  • (123).456.7899
  • (123)-456-7899
  • 123-456-7899
  • 123 456 7899
  • 1234567899
于 2013-11-07T16:04:44.350 回答
5

如果您首先对数据进行规范化,那么您可以避免验证电话号码所需的所有非常复杂的正则表达式。根据我的经验,复杂的正则表达式模式可能有两个不需要的副作用:(1)它们可能会出现意外的行为,以后调试起来会很痛苦,(2)它们可能比简单的正则表达式模式慢,当你正在循环中执行正则表达式。

通过使您的正则表达式尽可能简单,您可以减少这些风险,并且您的代码将更容易被其他人遵循,部分原因是它更容易预测。以您的电话号码为例,首先我们可以通过像这样去除所有非数字来规范化该值:

value = $.trim(value).replace(/\D/g, '');

现在您的美国电话号码(或任何其他语言环境)的正则表达式模式可以简单得多:

/^1?\d{10}$/

正则表达式不仅更简单,而且更容易理解正在发生的事情:一个可选地以数字 1(美国国家代码)开头的值,后跟十位数字。如果您想格式化验证值以使其看起来更漂亮,那么您可以使用这个稍长的正则表达式模式:

/^1?(\d{3})(\d{3})(\d{4})$/

这意味着一个可选的前导数字,后跟三位数字,另外三位数字,并以四位数字结尾。记住每组数字后,您可以以任何方式输出。这是一个使用 jQuery Validation 的 codepen 来说明这两个语言环境(新加坡和美国)的情况:

http://codepen.io/thdoan/pen/MaMqvZ

于 2015-11-27T10:15:44.873 回答
2
jQuery.validator.methods.matches = function( value, element, params ) {
    var re = new RegExp(params);
    // window.console.log(re);
    // window.console.log(value);
    // window.console.log(re.test( value ));
    return this.optional( element ) || re.test( value );
}

rules: {
        input_telf: {
            required  : true,
            matches   : "^(\\d|\\s)+$",
            minlength : 10,
            maxlength : 20
        }
    }
于 2016-12-04T12:53:08.097 回答
1

我知道这是一篇旧帖子,但我想我会分享我的解决方案来帮助他人。

如果您想要有效的 10 位电话号码“美国号码”,此功能将起作用

function getValidNumber(value)
{
    value = $.trim(value).replace(/\D/g, '');

    if (value.substring(0, 1) == '1') {
        value = value.substring(1);
    }

    if (value.length == 10) {

        return value;
    }

    return false;
}

这里如何使用这个方法

var num = getValidNumber('(123) 456-7890');
if(num !== false){
     alert('The valid number is: ' + num);
} else {
     alert('The number you passed is not a valid US phone number');
}
于 2016-02-11T19:40:40.110 回答
1

这个对我有用:-

/^\(?(\d{3})\)?[-\. ]?(\d{3})[-\. ]?(\d{4})$/
于 2016-10-09T11:55:49.220 回答
1

我尝试了以下解决方案,它对我来说很好。

/\(?([0-9]{3})\)?([ .-]?)([0-9]{3})\2([0-9]{4})/

尝试以下电话格式:

  • +(123) 456 7899
  • (123) 456 7899
  • (123).456.7899
  • (123)-456-7899
  • 123-456-7899
  • 123 456 7899
  • 1234567899
于 2020-02-20T07:06:56.587 回答