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

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

我会用我目前的尝试来回答,但我希望有人有更好的和/或更优雅的东西。


当前回答

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

/^[+#*\(\)\[\]]*([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

它是由你来消毒展示。经过验证,它可能是一个数字。

其他回答

.*

如果用户想要给你他们的电话号码,那么相信他们会把它做好。如果他们不想给你,那么强迫他们输入一个有效的数字,要么把他们送到竞争对手的网站,要么让他们输入一个符合你的正则表达式的随机字符串。我甚至可能会忍不住去查询占星热线的电话号码,然后输入这个号码。

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

"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"

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

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

执行替换格式化字符,然后检查剩余的电话有效性。在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同样有效,但要简单得多。

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

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

or

((\+63)|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  

第一个将匹配任何两位数的国家代码,而第二个将匹配菲律宾国家代码。

在这里测试:http://refiddle.com/1ox

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

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

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

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

亚当