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

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{9}

根据你的需要,开始使用吧。

function validateMobile($phone)
{
    $pattern = "/^(05)\d{9}$/";
    if (!preg_match($pattern, $phone))
    {
        return false;
    }
    return true;
}

$phone = "0532486061";

if(!validateMobile($phone))
{
    echo 'Incorrect Mobile Number!';
}

$phone = "05324860614";
if(validateMobile($phone))
{
    echo 'Correct Mobile Number!';
}

其他回答

简单的正则表达式和其他技巧都有用。

.*

但是显示输入的提示/示例/占位符/工具提示。

然后在提交之前在前端验证格式是否正确是最好的体验。

这将为没有经验的用户简化格式。

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

然后,你会得到这样的值:

 12345678901
 12345678901x1234
 345678901x1234
 12344678901
 12345678901
 12345678901
 12345678901
 +4112345678
 +441234567890

然后,当你显示,重新格式化为您的心脏内容。如。

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

你会很难用一个简单的正则表达式处理国际号码,看看这篇关于国际(甚至北美)电话号码的困难的文章。

您需要解析前几位数字以确定国家代码,然后根据国家采取不同的操作。

除此之外——你给出的列表不包括另一种常见的美国格式——省略了首字母1。在美国,大多数手机都不需要这种功能,这将开始困扰年轻一代,除非他们拨打国际长途电话。

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

亚当

如果你只是想验证你在字段中没有随机垃圾(即来自表单垃圾邮件者),这个正则表达式应该做得很好:

^[0-9+\(\)#\.\s\/ext-]+$

请注意,它没有任何特殊的规则来说明有多少位数字,或者这些数字中哪些数字是有效的,它只是验证只有数字、括号、破折号、加号、空格、磅、星号、句号、逗号或字母e、x、t存在。

它应该与国际数字和本地化格式兼容。你认为某些区域需要使用方括号、花括号或尖括号吗?(目前他们不包括在内)。

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

虽然剥离所有/大多数非数字字符在服务器端可能工作得很好(特别是如果您计划将这些值传递给拨号器),但您可能不希望在验证期间打乱用户的输入,特别是如果您希望他们在另一个字段中进行更正。

由于这篇文章没有语言标签,我将给出一个在python中使用的正则表达式解决方案。

表达式本身:

1[\s./-]?\(?[\d]+\)?[\s./-]?[\d]+[-/.]?[\d]+\s?[\d]+

在python中使用时:

import re

phonelist ="1-234-567-8901,1-234-567-8901 1234,1-234-567-8901 1234,1 (234) 567-8901,1.234.567.8901,1/234/567/8901,12345678901"

phonenumber = '\n'.join([phone for phone in re.findall(r'1[\s./-]?\(?[\d]+\)?[\s./-]?[\d]+[-/.]?[\d]+\s?[\d]+' ,phonelist)])
print(phonenumber)

输出:

1-234-567-8901
1-234-567-8901 1234
1-234-567-8901 1234
1 (234) 567-8901
1.234.567.8901
1/234/567/8901
12345678901