【问题标题】:jQuery validation of NANP Phone numbersNANP电话号码的jQuery验证
【发布时间】:2011-10-18 10:37:03
【问题描述】:

我正在尝试验证我的表单。在我的表格中是一个电话号码字段。用户插入电话号码并进行验证以及格式化。我在 StackOverflow 和其他地方的搜索中阅读了很多其他类似的问题,但我被困住了。表单一直说我插入的有效数字无效。

我只关心 NANP 数字,我知道 NANP 数字的格式如下:NXX-NXX-XXXX,其中 N 只能是数字 [2-9],X 可以是 [0-9]。我不需要国家代码。

这是我的代码:

function validatePhone(){
    var error = 1;

    var hasError = false;
    var $this = $(this);
    var regex1 = /^(\()?[2-9]{1}\d{2}(\))?(-|\s)?[2-9]{1}\d{2}(-|\s)\d{4}$/;

    phone = $(this).val();
    phone = phone.replace(/[^0-9]/g,'');        
    if(!regex1.test(phone)){
        hasError = true;
        $this.css('background-color','#FFEDEF');
    }   
    else{
        area = phone.substring(0,3);
        prefix = phone.substring(3,6);
        line = phone.substring(6);
        $this.val('(' + area + ') ' + prefix + '-' + line);
        $this.css('background-color','#FFFFFF');    
    }

这个想法是,无论我插入 8012559553、(801)2559553、(801)255-9553、801-255-9553 还是类似的东西,它都会被验证并格式化如下:(801) 255-9553 .但同样,出于某种原因,表格继续说我插入的任何数字都是无效的,无论它是否有效。这是我正在使用的代码,但不符合 NANP 格式:

function validatePhone(){
    var error = 1;

    var hasError = false;
    var $this = $(this);
    phone = $(this).val();
    phone = phone.replace(/[^0-9]/g,'');        
    if(phone.length != 10){
            hasError = true;
            $this.css('background-color','#FFEDEF');
    }   
    else{
            area = phone.substring(0,3);
            prefix = phone.substring(3,6);
            line = phone.substring(6);
            $this.val('(' + area + ') ' + prefix + '-' + line);
            $this.css('background-color','#FFFFFF');    
    }

所以,我在执行数字的正则表达式测试以确保数字是真实的然后正确格式化数字时遇到了麻烦...有什么想法吗?

【问题讨论】:

  • 这是一个很好的链接,当您尝试使其正常工作时:regextester.com
  • 你之前的代码怎么不符合NANP格式?它似乎接受任何 10 位数的电话号码,无论他们使用括号、逗号、句点、连字符等,然后将字符串修改为有效的 NANP 格式。
  • @moses 之前的代码允许 1234567890 作为电话号码,根据 NANP 标准,这不起作用。 NXX-NXX-XXXX。 N 不能是数字 0 或 1。希望对您有所帮助。
  • @Michael 是的,我现在明白了。我发布了一个检查 NANP 标准的工作解决方案,并解释了您原始代码中的问题。

标签: jquery validation phone-number


【解决方案1】:

这是我的不是很严格但很好的正则表达式:

/^\D*([2-9]\d{2}\D*){2}(\d{2}\D*){2}\D*$/

它接受:

  • (235)-546-42-09
  • 452-845-12-12
  • [933]-323-34-53
  • 222-435-0903
  • 222-4350903
  • 2224350903
  • (222)——785——12——76

不接受:

  • 111-342-45-45
  • 234-111-50-78
  • 222-222-222-2(您可以简单地修改 RegExp 来删除它)

【讨论】:

    【解决方案2】:

    您的代码的问题是regex1 正在phone 字符串中寻找特殊字符。代码失败,因为您要从 phone = phone.replace(/[^0-9]/g,''); 行中的 phone 字符串中删除所有特殊字符,因此当您针对 regex1 进行测试时,您正在寻找已删除的值。

    无论如何,你的方法很好。通常,我发现使用两个简单的 REGEX 比尝试将所有内容都放入一个包罗万象的 REGEX 更容易。一旦您将 regex1 修改为仅对没有特殊字符的 10 位数字进行 NANP 有效性检查,您的代码就可以正常工作。

    function validatePhone(){
        var error = 1;
    
        var hasError = false;
        var $this = $(this);
        var regex1 = /^([2-9]{1}\d{2})([2-9]{1}\d{2})\d{4}$/;
    
        phone = $(this).val();
        phone = phone.replace(/[^0-9]/g,'');        
        if(!regex1.test(phone)){
            hasError = true;
            $this.css('background-color','#FFEDEF');
        }   
        else{
            area = phone.substring(0,3);
            prefix = phone.substring(3,6);
            line = phone.substring(6);
            $this.val('(' + area + ') ' + prefix + '-' + line);
            $this.css('background-color','#FFFFFF');    
        }
    

    【讨论】:

    • 感谢您的帮助和解释。我很感激!
    • /^1?([2-9]\d{2})([2-9]\d{2})(\d{4})$/ 会是一个更好的正则表达式,那么您可以使用.replace 而不是所有的substrings。 $this.val(phone.replace(regex1, '($1) $2-$3'));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2011-08-07
    • 2012-10-27
    相关资源
    最近更新 更多