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

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

确保使用全局和多行标记来确保。

链接:http://www.regexr.com/3bp4b

其他回答

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

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

必须以数字结尾,可以以(或+或数字开头,并且可以包含+ -(或)

如果讨论的是表单验证,那么验证正确含义和正确数据的regexp将非常复杂,因为不同国家和提供者的标准各不相同。它也很难跟上时代。

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

北美是简单明了的,而在国际上,我更喜欢使用一种“惯用”模式,即人们指定和记忆数字的方式:

^((((\(\d{3}\))|(\d{3}-))\d{3}-\d{4})|(\+?\d{2}((-| )\d{1,8}){1,5}))(( x| ext)\d{1,5}){0,1}$

北美模式确保如果包含一个括号,则两个括号都包含。国际帐户包含可选的首字母“+”和国家代码。在那之后,你就进入了成语。有效的匹配将是:

(xxx) xxx-xxxx (xxx) -xxx-xxxx (xxx) xxx-xxxx x123 12 1234 123 1 x1111 12 12 12 12 12 1 1234 123456 x12345 +12 1234 1234 +12 12 1234 +12 1234 5678 + 12 12345678

这可能有偏见,因为我的经验仅限于北美、欧洲和一小部分亚洲。

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

((\+[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

使用简单的正则表达式处理各种国际电话号码几乎是不可能的。

你最好使用numverify.com这样的服务,他们为国际电话号码验证提供了免费的JSON API,此外,每个请求都可以获得有关国家、位置、运营商和线路类型的有用详细信息。