如何使用Javascript中的.replace()函数格式化电话号码

时间:2014-11-03 19:41:51

标签: javascript jquery regex

我正在使用javascript和/或jQuery中的加拿大电话号码的正则表达式。在通过我的主要正则表达式后,我在格式化方面遇到了一些麻烦。

主要是,当用户离开输入栏时,我需要以这种方式格式化电话号码:

  1. 111-222-3333
  2. 111-222-3333#44444(最多5位数)
  3. 1-222-333-4444
  4. 1-222-333-4444#55555(最多5位数)
  5. 如上所示,我希望能够同时格式化普通电话号码和免费电话号码。

    代码

    在我的HTML中,我做了一个简单的输入字段。

    <input id="assure_telephone" placeholder="Phone number" name="assure_telephone" maxlength="25" type="text" />
    

    对于我的jQuery,我选择了我的大文件中的代码并简化了一下。我们需要关注我的正则表达式。

    $('#assure_telephone').bind('change', function(){
        // Delete all caracters and specials caraters except numbers
        telephone_user = $('#assure_telephone').val().replace(/[^0-9]/g, '');
    
        // Format the new phone number
        telephone_user_regex = telephone_user.replace(/(\d{3})(\d{3})(\d{4})(\d{0,5})/, "$1-$2-$3 #$4");
    
        $('#assure_telephone').val(telephone_user_regex);
    });
    

    我的代码背后的逻辑

    正如您所看到的,我首先删除所有特殊字符以仅保留数字,然后在我使用.replace()Javscript函数应用格式化之后。

    链接到我的实际演示:http://jsfiddle.net/y201gcdg/6/

    正如您所看到的,很明显,免费电话无法正常工作,因为我的格式化工作是针对普通电话号码而非免费的。

    我的问题是:有没有办法用我的 telephone_user_regex 变量的长度工作来检测它是免费的还是没有 OR 有什么办法用更好的正则表达式来实现它?

    或者,我在Stackoverflow上创建了这个可能有帮助的内容:https://code.google.com/p/libphonenumber/(来源:Phone number format in Javascript

    其他资源:http://www.w3schools.com/jsref/jsref_replace.asp

    编辑#1 - 在没有用的答案后将其删除。

    编辑#2 - 可能的答案:计算字符数 资料来源:A comprehensive regex for phone number validation

    我可以从我的第一个replace()函数开始,然后计算caracter的数量,如果它超过X数,则应用格式化,否则执行另一个。


    编辑#3 - 由于我不想回答我自己的问题,我会在这里发布我的工作。

    var typephone = type;
    
    // We take out all caracters except 0 to 9
    var telephone_user = $('#'+typephone).val().replace(/[^0-9]/g, '');
    
    // Now I can make switch case to detect the kind of phone number I need to format
    switch(telephone_user.length) {
               case 0 :
               case 1 :
               case 2 :
               case 3 :
               case 4 :
               case 5 :
               case 6 :
               case 7 :
               case 8 :
               case 9 :
                    console.log('Your phone number is too small');
                    break;
               case 10 : 
                    console.log('This is a phone number 111-222-3333');
                    break;
     }
    

    通过这种方式,我能够检测到长度,并且我能够知道它是免费电话号码还是普通电话号码。如果客户写下这样的话,我可能会遇到麻烦:111-222-3333#44444。删除特殊字符后,我将无法知道它是否是扩展名。

1 个答案:

答案 0 :(得分:0)

这是我的建议:

  1. 请勿替换#(即do replace(/[^0-9#]/g, '')),否则您无法检测第11个字符是国家/地区代码还是扩展名。
  2. 然后,您可以使用#的位置来确定实际数字的长度(不包含扩展名),即telephone_user.search("#")
  3. 然后,您可以根据#2有条件地格式化电话号码,例如如果是第12位,请使用国家代码格式化telephone_user。此外,使用switch-case,我只会执行3-4个有效案例,并默认其他所有案例。