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

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'。

在Python中:

注意:BAD_AREA_CODES来自一个文本文件,您可以从web上获取。

BAD_AREA_CODES = open('badareacodes.txt', 'r').read().split('\n')

def is_valid_phone(phone_number, country_code='US'):
    """for now, only US codes are handled"""
    if country_code:
        country_code = country_code.upper()

    #drop everything except 0-9 and 'x'
    phone_number = filter(lambda n: n.isdigit() or n == 'x', phone_number)

    ext = None
    check_ext = phone_number.split('x')
    if len(check_ext) > 1:
        #there's an extension. Check for errors.
        if len(check_ext) > 2:
            return False
        phone_number, ext = check_ext

    #we only accept 10 digit phone numbers.
    if len(phone_number) == 11 and phone_number[0] == '1':
        #international code
        phone_number = phone_number[1:]
    if len(phone_number) != 10:
        return False

    #area_code: XXXxxxxxxx 
    #head:      xxxXXXxxxx
    #tail:      xxxxxxXXXX
    area_code = phone_number[ :3]
    head      = phone_number[3:6]
    tail      = phone_number[6: ]

    if area_code in BAD_AREA_CODES:
        return False
    if head[0] == '1':
        return False
    if head[1:] == '11':
        return False

    #any other ideas?
    return True

这涵盖了相当多的内容。它不是一个正则表达式,但它确实很容易映射到其他语言。

土耳其的工作例子,只要改变

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!';
}

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

为了进一步分析,你可以订阅众多提供商中的一家,这些提供商会让你访问有效号码数据库,并告诉你他们是座机还是移动电话,断开连接等等。这需要花钱。

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

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

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

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

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

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

这是我目前为止最好的尝试。它处理上面的格式,但我确信我错过了一些其他可能的格式。

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