【问题标题】:Phone validation电话验证
【发布时间】:2015-06-03 14:36:01
【问题描述】:

我的项目快结束了,我需要一些助手。我需要一个正则表达式代码来验证电话号码。如果电话号码不为空,请验证电话号码是否为以下格式之一:

‘xxx–xxx-xxxx’ – 10 位数字,带有两个破折号,其中第一个破折号在第三和第四位数字之间,第二个破折号在第六和第七位数字之间。

‘xxxxxxxxxx’’——全部 10 位数字,或者,

‘(xxx)xxxxxxx’’ – 10 位数字,前三位数字用括号括起来。

‘(xxx)–xxx-xxxx’——10位数字,前三位用括号括起来,第六位和第七位之间有一个破折号。 如果电话号码不符合要求的格式,它还需要提供警报。验证必须接受所有格式,否则将失败。

我的问题是我尝试使用正则表达式来做到这一点,因为我觉得这对我来说很容易。我根本不是经验丰富的程序员,所以编写代码从来都不是我的事,我的问题是有一个 RegExpression 可以同时涵盖所有格式,如果没有选择数字并且用户不使用它,仍然能够给我一个警报所需的格式。

这是我当前的代码,但它不包括四种格式。

var phone = document.myForm.phone.value;
if (!/^\d{3}-\d{3}-\d{4}$/.test(document.myForm.phone.value)) {
alert("Please enter the correct phone format ");

此代码仅涵盖 xxx-xxx-xxxx。是否可以使用这种代码覆盖所有格式?请它必须是像我在代码示例中那样以“var phone”开头的正则表达式,否则它往往会变得混乱。

提前致谢

【问题讨论】:

  • 你为什么不学习正则表达式或使用谷歌?这是一个常见的问题。
  • 为什么不为其他 3 种模式添加测试?
  • 通过替换 ()-\s 标准化并验证 xxxxxxxxxx ?
  • @AlexK。但是输入()()()()()(((())))(()(89898989------08)) 是正确的,对吗?

标签: javascript regex validation


【解决方案1】:

如果您不熟悉正则表达式,它可能会变得非常棘手。每当我需要测试一些正则表达式/查找帮助时,我都会使用Regexr。用于测试正则表达式的漂亮小沙盒。

至于你的问题,我认为这会很好。

var phone = [
    '555-555-5555',
    '(555)-555-5555',
    '(555)555-5555',
    '5555555555',
    '(555)5555555'
    ];

for ( var i = 0; i < phone.length; i++ ) {
    if ( !/(?:\d{1}\s)?\(?(\d{3})\)?-?\s?(\d{3})-?\s?(\d{4})/.test(phone[i]) ) {
        console.log(phone[i]+': invalid');
    }
}

我也确实使用了我上面链接的站点中的一个社区正则表达式 sn-ps。不值得称赞。

您的正则表达式本身就差不多了。如果您想将某些东西设为“可选”,请在您想要设为可选之前使用?。在这种情况下,( ) 应该是可选的,因此\(?\d{3}\)? 将使( ) 成为可选,但仍强制要求\d{3}。

【讨论】:

  • 我需要警报而不是 console.log。这对我不起作用。
  • @Bigpat 这是一项测试,显示它在一个 sn-p 中检查几种不同的电话号码类型。如果您希望它发出警报,只需复制/粘贴 if 语句并将 console.log() 更改为 alert("whatever")。
【解决方案2】:

与其制作一个复杂/庞大的正则表达式,为什么不测试多个更简单的正则表达式?

var phones = [
        '0123456789',
        '012-345-6789',
        '(012)3456789'
    ],
    tests = [
        /^\d{3}-\d{3}-\d{4}$/,
        /^\d{10}$/
    ],
    pre = document.getElementById('out');

phones.forEach(function (phone) {
    pre.textContent += phone + ' : ';
    var pass = tests.some(function (test) {
        return test.test(phone.toString());
    });
    
    if (pass) {
        pre.textContent += 'pass';
    } else {
        pre.textContent += 'fail'
    }
    
    pre.textContent += '\n';
});
&lt;pre id="out"&gt;&lt;/pre&gt;

我在这个例子中只包含了 2 个规则,但是你可以看到它会更容易维护,添加/删除规则。

【讨论】:

    【解决方案3】:

    (?:^\d{3}-\d{3}-\d{4}$)|(?:^\(\d{3}\)\d{3}-\d{4}$)|(?:[0-9]{10})

    这将涵盖您提到的三个示例。

    (如果您自己构建每个示例,然后用管道连接(相当于“或”),您可以添加更多...)

    但是如果您要捕获 ALL 有效电话号码格式,这将变得相当冗长。在这一点上,我会建议一种不同的方法。

    【讨论】:

    • 这不适用于我的代码 var phone = document.PizzaForm.phone.value; if (!(?:^\d{3}-\d{3}-\d{4}$)|(?:^(\d{3})\d{3}-\d{4}$ )|(?:[0-9]{10})/.test(document.PizzaForm.phone.value)) { alert("请提供正确的电话号码。"); }
    猜你喜欢
    • 2020-02-16
    • 1970-01-01
    • 2018-03-07
    • 2012-10-27
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多