如何使用regex验证电话号码

如何使用regex验证电话号码,regex,validation,phone-number,Regex,Validation,Phone Number,我正试图建立一个全面的正则表达式来验证电话号码。理想情况下,它将处理国际格式,但它必须处理美国格式,包括以下内容: 1-234-567-8901 1-234-567-8901 x1234 1-234-567-8901 ext1234 1 234 567-8901 1.234.567.8901 1/234/567/8901 12345678901 我将用我目前的尝试来回答,但我希望有人有更好和/或更优雅的东西。这是我迄今为止最好的尝试。它处理上面的格式,但我肯定我遗漏了一些其他可能的格式 ^\d?

我正试图建立一个全面的正则表达式来验证电话号码。理想情况下,它将处理国际格式,但它必须处理美国格式,包括以下内容:

1-234-567-8901 1-234-567-8901 x1234 1-234-567-8901 ext1234 1 234 567-8901 1.234.567.8901 1/234/567/8901 12345678901
我将用我目前的尝试来回答,但我希望有人有更好和/或更优雅的东西。

这是我迄今为止最好的尝试。它处理上面的格式,但我肯定我遗漏了一些其他可能的格式

^\d?(?:(?:[\+]?(?:[\d]{1,3}(?:[ ]+|[\-.])))?[(]?(?:[\d]{3})[\-/)]?(?:[ ]+)?)?(?:[a-zA-Z2-9][a-zA-Z0-9 \-.]{6,})(?:(?:[ ]+|[xX]|(i:ext[\.]?)){1,2}(?:[\d]{1,5}))?$

你看过了吗


输入美国电话号码带来了一系列的可能性。

事实证明,至少对北美来说,这是一种特殊的情况,称为

您需要准确地指定您想要的内容。什么是法定分隔符?空格、破折号和句点?不允许使用分隔符?是否可以混合分隔符,例如+0.111-222.3333?如何处理扩展,例如111-222-3333 x 44444?像911这样的特殊号码呢?区号是可选的还是必需的

这是一个7位或10位数字的正则表达式,允许扩展名,分隔符是空格、破折号或句点:

^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$

更好的选择。。。只需去掉输入中除“x”和前导“+”符号以外的所有非数字字符,因为英国人倾向于以非标准形式+44 0书写数字。。。当要求在该特定情况下使用国际前缀时,您应完全放弃0

然后,您将得到如下值:

 12345678901
 12345678901x1234
 345678901x1234
 12344678901
 12345678901
 12345678901
 12345678901
 +4112345678
 +441234567890
然后,当您显示时,重新格式化为您的心满意足。e、 g

  1 (234) 567-8901
  1 (234) 567-8901 x1234

我在一家市场调查公司工作,我们必须一直过滤这些类型的输入。你把事情弄得太复杂了。只需去掉非字母数字字符,看看是否有扩展名


为了进行进一步的分析,您可以订阅许多提供商中的一个,这些提供商将允许您访问有效号码的数据库,并告诉您这些号码是固定电话还是移动电话、断开连接等。这需要花钱。

您将很难用一个简单的正则表达式处理国际号码,请参阅国际电话号码甚至北美电话号码的困难

您需要解析前几个数字以确定国家代码是什么,然后根据国家采取不同的行动

除此之外,您给出的列表不包括另一种常见的美国格式,去掉了首字母1。在美国,大多数手机都不需要它,除非年轻一代已经拨打了国际长途,否则它将开始困扰他们

你已经正确地认识到这是一个棘手的问题

-Adam

我相信,特别是Perl模块的源代码可能会有所帮助

可能应该更详细地说明这个问题,以解释验证数字的目的。例如,911在美国是一个有效数字,但911x不代表任何x值。这样电话公司就可以计算你什么时候拨号了。在这个问题上有几种不同的说法。但是您的正则表达式没有检查区号部分,所以这似乎不是一个问题

就像验证电子邮件地址一样,即使你有一个有效的结果,你也无法知道它是否分配给了某人,直到你尝试它


如果您正在尝试验证用户输入,为什么不规范化结果并处理它呢?如果用户输入了一个您无法识别为有效数字的数字,请将其另存为输入或删除不可用字符。Perl模块可能是一个灵感来源。

尽管去除所有空白的答案很简单,但它并不能真正解决所提出的问题,即找到正则表达式。以我的测试脚本为例,它下载一个网页并使用正则表达式提取所有电话号码。既然你无论如何都需要一个正则表达式,你最好让正则表达式来完成所有的工作。我想到了这个:

1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?
这里有一个perl脚本来测试它。匹配时,$1包含区号,$2和$3包含电话号码,$5包含分机。我的测试脚本从internet下载一个文件并打印其中的所有电话号码

#!/usr/bin/perl

my $us_phone_regex =
        '1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?';


my @tests =
(
"1-234-567-8901",
"1-234-567-8901 x1234",
"1-234-567-8901 ext1234",
"1 (234) 567-8901",
"1.234.567.8901",
"1/234/567/8901",
"12345678901",
"not a phone number"
);

foreach my $num (@tests)
{
        if( $num =~ m/$us_phone_regex/ )
        {
                print "match [$1-$2-$3]\n" if not defined $4;
                print "match [$1-$2-$3 $5]\n" if defined $4;
        }
        else
        {
                print "no match [$num]\n";
        }
}

#
# Extract all phone numbers from an arbitrary file.
#
my $external_filename =
        'http://web.textfiles.com/ezines/PHREAKSANDGEEKS/PnG-spring05.txt';
my @external_file = `curl $external_filename`;
foreach my $line (@external_file)
{
        if( $line =~ m/$us_phone_regex/ )
        {
                print "match $1 $2 $3\n";
        }
}
编辑:

您可以将正则表达式中的\W*更改为\s*\W?\s*,以稍微收紧它。我在编写表单时并没有考虑过regex,比如说,验证表单上的用户输入,但这一变化使使用regex实现这一目的成为可能

'1?\s*\W?\s*([2-9][0-8][0-9])\s*\W?\s*([2-9][0-9]{2})\s*\W?\s*([0-9]{4})(\se?x?t?(\d*))?';

我倾向于同意剥离非数字内容,接受现有内容是最好的。也许是为了确保至少有两个数字存在,尽管这确实禁止像字母顺序的电话号码这样的东西,比如问杰克

几个简单的perl表达式可能是:

@f = /(\d+)/g;
tr/0-9//dc;
使用第一个选项将数字组保持在一起,这可能会提供格式线索。使用第二个简单地抛出所有非数字

是否担心可能需要暂停,然后输入更多键?或者55岁左右
5-1212等待哔的一声123?

如果您正在谈论表单验证,验证正确含义和正确数据的regexp将非常复杂,因为不同的国家和提供商标准。也很难跟上时代的步伐

我将此问题解释为寻找一个广泛有效的模式,该模式可能内部不一致-例如,拥有一组有效的数字,但不验证干线、交换机等是否与国家代码前缀的有效模式一致

北美是直截了当的,就国际而言,我更喜欢使用“惯用”模式,涵盖人们指定和记住数字的方式:

^((((\(\d{3}\))|(\d{3}-))\d{3}-\d{4})|(\+?\d{2}((-| )\d{1,8}){1,5}))(( x| ext)\d{1,5}){0,1}$
北美模式确保如果包含一个括号,则两个括号都包含在内。国际帐户包含可选的首字母“+”和国家代码。在那之后,你就进入了成语。有效匹配项为:

xxxxxx-xxxx xxx xxx xxxx xxxxxx-XXXXX123 12 1234 123 1 x1111 12 12 12 12 12 12 1 1234 123456 x12345 +12 1234 1234 +12 12 12 1234 +12 1234 5678 +12 12345678
这可能有失偏颇,因为我的经验仅限于北美、欧洲和一小部分亚洲地区。

我也在为同样的问题而挣扎,试图让我的应用程序成为未来的证明,但这些人让我朝着正确的方向前进。我并不是在检查数字本身,看它是否有效,我只是想确保输入的一系列数字可能有扩展名,也可能没有扩展名

最坏的情况是,如果用户必须从XML文件中提取一个未格式化的号码,他们仍然会将这些号码输入手机的号码Pad 012345678x5,没有真正的理由保持它的美观。这种正则表达式对我来说是这样的:

\d+ ?\w{0,9} ?\d+
01234467分机123456 01234567x123456 01234567890
对格式化字符进行替换,然后检查剩余字符的电话有效性。在PHP中

 $replace = array( ' ', '-', '/', '(', ')', ',', '.' ); //etc; as needed
 preg_match( '/1?[0-9]{10}((ext|x)[0-9]{1,4})?/i', str_replace( $replace, '', $phone_num );
像这样破坏一个复杂的regexp同样有效,但要简单得多

.*
如果用户想给你他们的电话号码,那么请相信他们会正确地告诉你。如果他们不想给你,那么强迫他们输入一个有效的数字,要么将他们发送到竞争对手的网站,要么让他们输入一个适合你的正则表达式的随机字符串。我甚至可能会被诱惑去查询一个保费占星术热线的号码,然后输入这个号码

我也将考虑以下任何一个在网站上的有效条目:

"123 456 7890 until 6pm, then 098 765 4321"  
"123 456 7890 or try my mobile on 098 765 4321"  
"ex-directory - mind your own business"

我写得最简单,虽然里面不需要点

^([0-9\(\)\/\+ \-]*)$ 如下所述,它只检查字符,而不检查其结构/顺序。请注意,对于常见的英国号码书写方式:+44 0 1234 567890(即拨国际号码): +441234567890
或者在英国拨打01234567890,我觉得这很有趣。我还没有测试它,但它看起来似乎会工作

<?php
/*
string validate_telephone_number (string $number, array $formats)
*/

function validate_telephone_number($number, $formats)
{
$format = trim(ereg_replace("[0-9]", "#", $number));

return (in_array($format, $formats)) ? true : false;
}

/* Usage Examples */

// List of possible formats: You can add new formats or modify the existing ones

$formats = array('###-###-####', '####-###-###',
                 '(###) ###-###', '####-####-####',
                 '##-###-####-####', '####-####', '###-###-###',
                 '#####-###-###', '##########');

$number = '08008-555-555';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '123-555-555';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '1800-1234-5678';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '(800) 555-123';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '1234567890';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}
?>

必须以数字结尾,可以以或+或数字开头,可能包含+-或

我的直觉被对这个话题的大量回复所强化——这个问题有几乎无限多的解决方案,没有一个是优雅的

老实说,我建议你不要试图验证电话号码。即使你可以编写一个大的,毛茸茸的验证器,允许所有不同的合法格式,它最终会允许几乎任何东西,甚至是一个电话号码在第一位远程类似


在我看来,最优雅的解决方案是验证最小长度,仅此而已。

对于任何有兴趣对爱尔兰手机号码进行类似操作的人,这里有一个简单的方法:

PHP

该链接上还有一个JQuery解决方案

编辑:

jQuery解决方案:

    $(function(){
    //original field values
    var field_values = {
            //id        :  value
            'url'       : 'url',
            'yourname'  : 'yourname',
            'email'     : 'email',
            'phone'     : 'phone'
    };

        var url =$("input#url").val();
        var yourname =$("input#yourname").val();
        var email =$("input#email").val();
        var phone =$("input#phone").val();


    //inputfocus
    $('input#url').inputfocus({ value: field_values['url'] });
    $('input#yourname').inputfocus({ value: field_values['yourname'] });
    $('input#email').inputfocus({ value: field_values['email'] }); 
    $('input#phone').inputfocus({ value: field_values['phone'] });



    //reset progress bar
    $('#progress').css('width','0');
    $('#progress_text').html('0% Complete');

    //first_step
    $('form').submit(function(){ return false; });
    $('#submit_first').click(function(){
        //remove classes
        $('#first_step input').removeClass('error').removeClass('valid');

        //ckeck if inputs aren't empty
        var fields = $('#first_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<12 || value==field_values[$(this).attr('id')] ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }
        });        

        if(!error) {
            if( $('#password').val() != $('#cpassword').val() ) {
                    $('#first_step input[type=password]').each(function(){
                        $(this).removeClass('valid').addClass('error');
                        $(this).effect("shake", { times:3 }, 50);
                    });

                    return false;
            } else {   
                //update progress bar
                $('#progress_text').html('33% Complete');
                $('#progress').css('width','113px');

                //slide steps
                $('#first_step').slideUp();
                $('#second_step').slideDown();     
            }               
        } else return false;
    });

    //second section
    $('#submit_second').click(function(){
        //remove classes
        $('#second_step input').removeClass('error').removeClass('valid');

        var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;  
        var fields = $('#second_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<1 || value==field_values[$(this).attr('id')] || ( $(this).attr('id')=='email' && !emailPattern.test(value) ) ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }


        function validatePhone(phone) {
        var a = document.getElementById(phone).value;
        var filter = /^[0-9-+]+$/;
            if (filter.test(a)) {
                return true;
            }
            else {
                return false;
            }
        }

        $('#phone').blur(function(e) {
            if (validatePhone('txtPhone')) {
                $('#spnPhoneStatus').html('Valid');
                $('#spnPhoneStatus').css('color', 'green');
            }
            else {
                $('#spnPhoneStatus').html('Invalid');
            $('#spnPhoneStatus').css('color', 'red');
            }
        });

     });

        if(!error) {
                //update progress bar
                $('#progress_text').html('66% Complete');
                $('#progress').css('width','226px');

                //slide steps
                $('#second_step').slideUp();
                $('#fourth_step').slideDown();     
        } else return false;

    });


    $('#submit_second').click(function(){
        //update progress bar
        $('#progress_text').html('100% Complete');
        $('#progress').css('width','339px');

        //prepare the fourth step
        var fields = new Array(
            $('#url').val(),
            $('#yourname').val(),
            $('#email').val(),
            $('#phone').val()

        );
        var tr = $('#fourth_step tr');
        tr.each(function(){
            //alert( fields[$(this).index()] )
            $(this).children('td:nth-child(2)').html(fields[$(this).index()]);
        });

        //slide steps
        $('#third_step').slideUp();
        $('#fourth_step').slideDown();            
    });


    $('#submit_fourth').click(function(){

        url =$("input#url").val();
        yourname =$("input#yourname").val();
        email =$("input#email").val();
        phone =$("input#phone").val();

        //send information to server
        var dataString = 'url='+ url + '&yourname=' + yourname + '&email=' + email + '&phone=' + phone;  



        alert (dataString);//return false;  
            $.ajax({  
                type: "POST",  
                url: "http://clients.socialnetworkingsolutions.com/infobox/contact/",  
                data: "url="+url+"&yourname="+yourname+"&email="+email+'&phone=' + phone,
                cache: false,
                success: function(data) {  
                    console.log("form submitted");
                    alert("success");
                }
                });  
        return false;

   });


    //back button
    $('.back').click(function(){
        var container = $(this).parent('div'),
        previous  = container.prev();

        switch(previous.attr('id')) {
            case 'first_step' : $('#progress_text').html('0% Complete');
                  $('#progress').css('width','0px');
                       break;
            case 'second_step': $('#progress_text').html('33% Complete');
                  $('#progress').css('width','113px');
                       break;

            case 'third_step' : $('#progress_text').html('66% Complete');
                  $('#progress').css('width','226px');
                       break;

        default: break;
    }

    $(container).slideUp();
    $(previous).slideDown();
});


});

.

对此,您最好使用屏蔽输入。这样,用户只能输入数字,您可以按自己认为合适的方式设置格式。我不确定这是否适用于web应用程序,但如果是,有一个非常点击的jQuery插件提供了一些选项


他们甚至在教程中讨论了如何屏蔽电话号码输入。

这是菲律宾手机号码的简单正则表达式模式:

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

将匹配以下各项:

+63.917.123.4567  
+63-917-123-4567  
+63 917 123 4567  
+639171234567  
09171234567  
第一个将匹配任何两位数的国家代码,而第二个将只匹配菲律宾国家代码


在此处测试:

我尝试使用无限制正则表达式:

/^[+#*\(\)\[\]]*([0-9][ ext+-pw#*\(\)\[\]]*){6,45}$/
接受:

+(01) 123 (456) 789 ext555
123456
*44 123-456-789 [321]
123456
123456789012345678901234567890123456789012345
*****++[](][((( 123456tteexxttppww
拒绝:

mob 07777 777777
1234 567 890 after 5pm
john smith
(empty)
1234567890123456789012345678901234567890123456
911

这取决于您对其进行消毒以供展示。在验证之后,它可能是一个数字。

这里有一个在JavaScript中运行良好的数字。它是一个字符串,因为这正是Dojo小部件所期望的

它匹配一个10位数的北美NANP号码,可选择扩展名。空格、破折号和句点是可接受的分隔符

"^(\\(?\\d\\d\\d\\)?)( |-|\\.)?\\d\\d\\d( |-|\\.)?\\d{4,4}(( |-|\\.)?[ext\\.]+ ?\\d+)?$"

如果您只是想验证字段中没有随机垃圾,即表单中的垃圾 此正则表达式的垃圾邮件发送者应该做得很好:

^[0-9+\(\)#\.\s\/ext-]+$
请注意,它没有任何关于数字数量或这些数字中哪些数字有效的特殊规则,它只是验证是否只存在数字、括号、破折号、加号、空格、磅、星号、句点、逗号或字母e、x、t

它应该与国际号码和本地化格式兼容。您是否预见到某些区域需要方括号、曲括号或尖括号?目前还没有包括在内

如果你想保持每位数的规则,比如美国的区号和前缀,交换代码必须在200-999之间,祝你好运。维护一套复杂的规则集,这套规则在未来任何时候都可能被世界上任何国家所过时,这听起来并不有趣


剥离所有/大多数非数字字符在服务器端可能会很好,特别是如果您计划将这些值传递给拨号器,那么您可能不想在验证期间对用户的输入进行重击,特别是如果您希望他们在另一个字段中进行更正的话。

我还建议您查看谷歌库。我知道它不是正则表达式,但它完全符合你的要求

例如,它将认识到:

15555555555
是一个可能的数字,但不是有效的数字。它还支持美国以外的国家

功能亮点:

解析/格式化/验证世界所有国家/地区的电话号码。 getNumberType-根据数字本身获取数字的类型;在可行的情况下,能够区分固定电话、移动电话、免费电话、费率、共享成本、VoIP和个人电话号码。 获取两个数字是否相同的置信度。 getExampleNumber/getExampleNumberByType-为所有国家/地区提供有效的示例号码,可以选择指定需要哪种类型的示例电话号码。 isPossiblenNumber-仅使用长度信息快速猜测某个号码是否为可能的电话号码,比完全验证快得多。 isValidNumber-使用长度和前缀信息对某个地区的电话号码进行完全验证。 AsyOutTypeFormatter-当用户输入每个数字时,动态格式化电话号码。 FindNumber-在文本输入中查找数字。 PhoneNumberOfLinegeCoder-提供与电话号码相关的地理信息。 例子 电话号码验证的最大问题是它在文化上非常依赖

美国 408 974–2042是一个有效的美国号码 999 974–2042不是有效的美国号码 澳大利亚 0404 999 999是一个有效的澳大利亚号码 029999999也是一个有效的澳大利亚号码 099999999不是有效的澳大利亚号码 正则表达式可以用来检查电话号码的格式,但它实际上无法检查电话号码的有效性

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     false
我建议跳过一个简单的正则表达式来测试你的电话号码,使用一个库,比如谷歌的

介绍libphonenumber! 使用一个更复杂的示例1-234-567-8901 x1234,您可以得到:

因此,您不仅可以了解电话号码是否有效,而且还可以在您的区域设置中获得一致的电话号码格式

作为奖励,libphonenumber还有许多数据集可用于检查电话号码的有效性,因此,请检查一个数字,例如+6129999999(国际版的returns),将其作为具有格式的有效号码:

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     true

Formatting Results

E164 format                    +61299999999
Original format                61 2 9999 9999
National format                (02) 9999 9999
International format           +61 2 9999 9999
Out-of-country format from US  011 61 2 9999 9999
Out-of-country format from CH  00 61 2 9999 9999
libphonenumber还为您提供了许多其他好处,例如获取检测到电话号码的位置,以及从电话号码获取时区信息:

PhoneNumberOfflineGeocoder Results
Location        Australia

PhoneNumberToTimeZonesMapper Results
Time zone(s)    [Australia/Sydney]
但是无效的澳大利亚电话号码返回它不是有效的电话号码

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     false
谷歌版本有Java和Javascript代码,但人们也为使用谷歌i18n电话号码数据集的其他语言实现了库:

PHP: 蟒蛇: 红宝石: C: 目标C: JavaScript: 万能药: 除非你确定你总是要接受来自一个地区的电话号码,并且它们总是以一种格式,否则我强烈建议你不要为此编写自己的代码,而使用libphonenumber来验证和显示电话号码。

/^:?::::00 |+[1-4]\d\d |[1-9]\d |[1-9]\d |[\-\\\\/]:?\d{1,}[\-\\\\\/]?{0,}?:[\-\\\\\\\\\/]?:\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/]?:\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

这符合:

 - (+351) 282 43 50 50
 - 90191919908
 - 555-8909
 - 001 6867684
 - 001 6867684x1
 - 1 (234) 567-8901
 - 1-234-567-8901 x1234
 - 1-234-567-8901 ext1234
 - 1-234 567.89/01 ext.1234
 - 1(234)5678901x1234
 - (123)8575973
 - (0055)(123)8575973
在$n上,它可以节省:

国家指标 电话号码 扩大
你可以在

上测试,在阅读完这些答案后,似乎没有一个简单的正则表达式可以解析一堆文本,并以任何格式提取电话号码,包括带加号和不带加号的国际电话号码

这是我最近在一个客户项目中使用的方法,我们必须将所有电话号码以任何格式转换为tel:links

到目前为止,它一直在使用他们抛出的所有东西,但如果出现错误,我会更新它 这就是答案

正则表达式:

/\+*\d{1,}*[|\]*\d{3}[^\d]*\d{3}[^\d]*\d{4}/

PHP函数将所有电话号码替换为tel:links,以防有人好奇:

function phoneToTel($number) {
    $return = preg_replace('/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/', '<a href="tel:$1$3$4$5">$1 ($3) $4-$5</a>', $number); // includes international
    return $return;
}

我在决定将我的答案也包括在此线程中作为答案之前,在另一个SO问题上回答了这个问题,因为没有人解决如何要求/不要求项目,只是分发regex:

从我在该网站上的帖子中,我创建了一个快速指南,帮助任何人根据自己想要的电话号码格式制作自己的正则表达式,我会像在另一个网站上一样警告大家,如果你限制太多,你可能得不到想要的结果,世界上没有一刀切的解决方案可以接受所有可能的电话号码——只有你决定接受的电话号码作为你选择的格式。使用风险自负

快速备忘单 启动表达式:/^ 如果需要空间,请使用:[\s]或\s 如果需要括号,请使用:[]和[]。使用\和\很难看,会让事情变得混乱。 如果你想让任何东西都是可选的,那就放一个?之后 如果需要连字符,只需键入-或[-]。但是,如果在一系列其他字符中未将其放在第一位或最后一位,则可能需要对其进行转义:\- 如果要在插槽中接受不同的选项,请在选项周围放上括号:[-。\s]需要连字符、句点或空格。最后一个括号后的问号将使该插槽的所有这些选项都是可选的。 \d{3}:需要3位数字:000-999。简写 [0-9][0-9][0-9]. [2-9]:该插槽需要数字2-9。 \+|1\s?:接受加号或1,空格管道字符|为或,并将其设置为可选。加号必须转义。 如果希望特定数字与插槽匹配,请输入它们:[246]将需要2、4或6.?:77 | 78或[77 | 78]将需要77或78。 $/:结束表达式
这是一个非常好的模式,它与我需要实现的验证最为匹配。我不是最初的作者,但我认为这很值得分享,因为我发现这个问题非常复杂,没有一个简明或广泛有用的答案

以下正则表达式将捕获各种全球电话号码格式中广泛使用的数字和字符组合:

1-234-567-8901
1-234-567-8901 x1234
1-234-567-8901 ext1234
1 (234) 567-8901
1.234.567.8901
1/234/567/8901
12345678901
1-234-567-8901 ext. 1234
(+351) 282 433 5050
/^\s*?:\+?\d{1,3}?[-.]*\d{3}[-.]*?\d{3}[-.]*\d{2,4}:[-.x]*\d+?\s*$/gm

肯定的: +42 555.123.4567 +1-800-123-4567 +7 555 1234567 +79261234567 926 1234567 +79261234567 926 1234567 9261234567 1234567 123-4567 123-89-01 495 1234567 469 123 45 67 89261234567 8 926 1234567 926.123.4567 415-555-1234 650-555-2345 416555-3456 202 555 4567 4035555678 14165559292

否定: 926 3 4 880600苹果


原始资料来源:

我发现这很有效:

^\(*\+*[1-9]{0,3}\)*-*[1-9]{0,3}[-. /]*\(*[2-9]\d{2}\)*[-. /]*\d{3}[-. /]*\d{4} *e*x*t*\.* *\d{0,4}$
它适用于以下数字格式:

1-234-567-8901
1-234-567-8901 x1234
1-234-567-8901 ext1234
1 (234) 567-8901
1.234.567.8901
1/234/567/8901
12345678901
1-234-567-8901 ext. 1234
(+351) 282 433 5050
确保使用全局和多行标志来确保


链接:

如果允许号码来自美国以外的国家,格式代码将是浪费时间。这是很好的,但它无法验证输入的是电话号码。例如,如果用户没有输入所需的10位数怎么办?这应该与良好的正则表达式验证相结合。考虑到问题是关于验证的-这是一个非常非常糟糕的答案。@我不同意。最初的问题是试图处理电话号码验证,因为它试图处理所有可能的格式选项。与其尝试解决所有这些问题,不如将输入内容预先去掉所有格式上的绒毛,直到你只知道数字。这样做解决了两个问题—测试结果现在很容易,您现在可以确保为显示而渲染的值可以一致地格式化。关于同谋者手套的答案的第一条评论是一本好书。。。有时候,问题的答案是以不同的方式解决。这怎么会是一个投票率如此之高的答案呢?这并不能验证任何东西。更糟糕的是所有其他的其他电话号码验证问题都是其他的电话号码验证问题都是其他所有其他的电话号码验证问题参考这一个……这里没有扩展部分这里没有扩展部分我让我的用户在一个单独的字段中输入ext我的用户在一个单独的字段中输入我::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::?????????????????????:::::::::::::::::::::::::::::::::::::::::::::,其他所有其他其他其他所有其他其他所有其他所有其他所有其他所有其他所有其他的其他电话号码的其他电话号码的其他电话号码的其他电话号码的电话号码的电话号码的其他[02-9]{2}\这是一个只匹配10位数字电话号码而不是7位数字的7位数字,像843-1212年这样的843-1212::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::????????????????????????????????????????????????????????????????????????????????????????????????????????????????[1-9]1 |[2-9][02-9]{2}\s*?:[.-]\s*?[0-9]{4}/10位接受区号周围的数字,此外,还不允许将1作为国家代码1作为国家代码1作为国家代码1作为国家代码1作为国家代码1作为国家代码?:::::::::::::::::::::::::::::::::\s*[2-9[2-9[2-9]1[2-9[2-9[2-9]1[2-9[2-9[2-9[2-9[2-9][[02-8[02-8[02-8[2-8]1[2-8[2-8[2-8]1[2-9[2-9[2-9[2-9[2-9][[2-9][[2-8[2-8[2-8[2-8[2-8[02-8]2-8[2-8[2-8[2-8]2-2-8[2-9][[2-8[02-8[02-8[02-8在过去的两年里,我一直把杰弗里·弗里德尔的书放在桌上,因为正则表达式是我工作的主要部分。这需要很长时间才能实现

我不懂正则表达式。有时,本网站的读者只是在寻找现有的解决方案,而不是编写自己的解决方案,特别是在有大量角落案例的领域,例如电话号码表示。@fatcat1111我知道,但这里的大多数回答都是“我也是”类型的一次性正则表达式,可能不适合您的任何情况。这些结果出现在我尝试使用的所有网站上,我无法输入我的邮政编码、电话号码或电子邮件地址,因为有人使用了一个不完整的正则表达式,例如:+是电子邮件地址中的有效字符。这个页面上最好的回答是指向库,而不是指向用餐巾纸涂鸦的正则表达式。我一直在尝试在javascript验证脚本中实现上述内容,但我一直收到一个无效的量词错误。你知道我做错了什么吗?我想补充一个小例子,手机没有符号,但可能有空格和国家代码,在欧洲,本地和手机号码是典型的:676412342,676 46 32 12,676 463 212我同意这里的观点,但有时,当电话号码实际用于用户感兴趣的重要事情时,执行验证是很好的。这里最好的例子是购买的信用卡授权。如果电话号码错误,身份验证可能会失败。如果用户不想输入他的电话号码,您可以允许该字段为可选字段,但是,如果用户要输入一个有效的电话号码,那么要求用户输入一个有效的电话号码是否太多了?验证的另一个作用是简单地提醒人们添加区号等,否则他们可能不会记得添加区号,但事后不可能猜到。@Pointy但regex验证对您没有帮助。要真正验证电话号码是否正确,唯一的方法是在手机情况下向其发送消息,并确保用户使用某种验证码进行确认。这是当数字正确性很重要时所做的。其他一切都是为了用户的方便,以防止一些但不是所有的打字错误,并没有验证任何东西。酷。我的电话号码是1'或1=1-PWNED。查看和验证?123%$*%$*456**$*$@8908将与您提出的解决方案相匹配。@PlexQ 555-123-1234、0777777、90210、01/01/1901-用户在通过验证夯实垃圾方面具有创造性。最好不要使用过度限制性的验证,告诉那些真正拥有一些奇怪数据的人他们是错的。我要冒一个险说,在几乎所有这个正则表达式的应用中,允许911作为电话号码可能是个坏主意。很好,不过,仅供参考,正则表达式也匹配:4570457-6789,这将是一个非常常见的打字错误。匹配组也会出现偏差:@SooDesuNe Prepending ^ |[^\d\n]启用多行标志可避免一般问题,确保其前面不会立即出现数字。请注意,这是以北美为中心的-它会丢失44 7911 123456。这将验证大量技术上无效的数字。比如,+。学习阅读正则表达式,这样你就可以理解你在做什么。@StevenSoroka从技术上讲,它可能允许很多无效的情况,但当我们考虑用最简单的解决方案帮助用户避免常见错误时,这是一种方法:这也是匹配的空白,空白line@HappyHardik. 的确简单而强大,对于基本验证,允许用户键入多个点、破折号、括号或加号。仅使用它,在许多方面都是错误的。例如,一个英国电话号码可能以+44开头,或者一个电话号码里面可能有0。但根据正则表达式,这是无效的。我推荐@Ismael Miguel的答案。它工作正常,我建议您修改您的答案。您的消息似乎表明您没有编写此代码。请你引用一个消息来源好吗?看起来是源代码。在尝试了许多方法并查看了现有数据和用户反馈后,我倾向于同意……不过有时候你需要进行验证。如果我发送确认码,我不能只向垃圾信息发送者在字段中输入的任何随机垃圾发送代码。在浪费资源发送信息之前,我想确定该号码可能是电话号码。谢谢。有区号的固定电话号码是028231234吗?我想知道区号是不是只有2-3位数字,而且前面总是0?这是我见过的最全面的正则表达式。在你删除^和$之前,很容易找到它,否则我可以使用[111][111][1111]或111-111-1111等等来找到它。对不起,删除了我的最后一条评论。你能重新措辞吗?我无法理解这一点:在你删除^1和$之前,很容易受到攻击,否则我可以使用[111][111][1111]绕过它。这是否意味着,当您使用“^”和“$”时,它会验证“[111][111][1111]”?我使用[111][111][1111]和111-111-1111 u绕过您的正则表达式

直到我从正则表达式中删除了^和$。^^^^这是一个很好的例子,说明了为什么评论线程不应该去聊天。我对这次对话的结果非常感兴趣,需要知道这个正则表达式是否足够坚固,可以在我的应用程序中使用。不幸的是,聊天对话现在不见了。老实说,我没有去聊天。在多次要求解释之后,我没有得到任何信息。你可以随时尝试自己与所有类型的数字,你找到网上,在多种格式。我尝试过使用多个电话号码,但如果周围有空格,效果就不太好。我必须找到一个解决方案来计算数字的数量并强制执行特定的数量。这个答案已经添加到了,在常见的验证任务下。这非常有用,但我怀疑并寻找一个{min,max}表达式。你能帮忙吗?如果这是我们正在讨论的一个位数,你可以根据它来匹配它,请看我放在那里的[2-9]块。这意味着你的最小值是2,最大值是9。相应地调整。此正则表达式匹配+1 123456222222222222222。为什么不直接返回?999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999。它与616-555-1234 x567匹配,但与616-555-1234 ext.567不匹配。例如,55555555或999999999999999999的假阳性。它不验证尼瑟兰麦克唐纳的号码+31 76 596 4192。我只是测试随机号码注意,现在还有Go端口:当检查它是否是一个可能的号码时,您不需要指定国家代码吗?我使用的是PHP版本,如果我输入一个英国数字,比如用实数0770000000替换0,我会得到缺失或无效的默认区域。错误但是如果我指定它将通过的国家代码。仅供参考:此库不支持某些国家,@BugHunterUK和任何遇到此问题并在解析数字时对此产生疑问的人,您可以指定预期的地区,并且库将在该地区查找非国际号码。如果你没有具体说明,它会拒绝任何不符合国际格式的东西。考虑它已经成为谷歌推荐的官方Go包而不是LiPoNeNoNo.。这看起来是一种将模糊的bug集成到代码中的好方法。应该避免链接的答案,因为它们可能会在将来中断并且使帖子无效。静态解决方案始终是维持答案价值所必需的。如果您想推荐超链接,请将其添加为问题下方的注释。而不是提供的解决方案。这是可能的。仅仅因为它很棘手或复杂,并不意味着你应该举起你的手臂。看,你也解决了它吗?就像一个符咒!谢谢分享
^\(*\+*[1-9]{0,3}\)*-*[1-9]{0,3}[-. /]*\(*[2-9]\d{2}\)*[-. /]*\d{3}[-. /]*\d{4} *e*x*t*\.* *\d{0,4}$
1-234-567-8901
1-234-567-8901 x1234
1-234-567-8901 ext1234
1 (234) 567-8901
1.234.567.8901
1/234/567/8901
12345678901
1-234-567-8901 ext. 1234
(+351) 282 433 5050