用于电话号码验证的全面正则表达式

时间:2008-09-23 20:13:43

标签: regex validation phone-number

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

  • 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

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

44 个答案:

答案 0 :(得分:502)

更好的选择......只需在输入中删除所有非数字字符(除了'x'和前导'+'符号),因为英国倾向于以非标准形式编写数字{{1}当被要求使用国际前缀时(在特定情况下,您应该完全丢弃+44 (0) ...)。

然后,你得到的结果如下:

(0)

然后当您显示时,重新格式化您的心灵内容。 e.g。

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

答案 1 :(得分:290)

事实证明,至少对于北美来说,有一个规范,称为NANP

您需要准确指定所需内容。什么是合法分隔符?空格,破折号和句号?不允许分隔符?可以混合分隔符(例如,+ 0.111-222.3333)吗?如何处理扩展(例如,111-222-3333 x 44444)?特殊号码怎么样,比如911?区号是可选的还是必需的?

这是一个7或10位数字的正则表达式,允许扩展名,分隔符是空格,短划线或句点:

^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$

答案 2 :(得分:286)

.*

如果用户想要给你他的电话号码,那么请相信他能做对。如果他不想给你,然后强迫他输入一个有效的号码将把他送到竞争对手的网站或让他输入一个适合你的正则表达式的随机字符串。我甚至可能会想要查看优质性别行的数量,然后输入它。

我还会将以下任何内容视为网站上的有效条目:

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

答案 3 :(得分:153)

我还建议查看" libphonenumber"谷歌图书馆。我知道它不是正则表达式,但它完全符合您的要求。

例如,它会认识到:

15555555555

是可能的数字,但不是有效数字。它还支持美国以外的国家。

功能亮点:

  • 解析/格式化/验证世界上所有国家/地区的电话号码。
  • getNumberType - 根据数字本身获取数字的类型;能够区分固定电话,移动电话,免费电话,高级费率,共享费用,VoIP和个人号码(只要可行)。
  • isNumberMatch - 获得两个数字是否相同的置信度。
  • getExampleNumber / getExampleNumberByType - 为所有国家/地区提供有效的示例号码,并可选择指定所需的示例电话号码类型。
  • isPossibleNumber - 通过仅使用长度信息快速猜测数字是否是可能的语音,比完整验证快得多。
  • isValidNumber - 使用长度和前缀信息完全验证区域的电话号码。
  • AsYouTypeFormatter - 当用户输入每个数字时,即时格式化电话号码。
  • findNumbers - 在文字输入中找到数字。
  • PhoneNumberOfflineGeocoder - 提供与电话号码相关的地理信息。

实施例

电话号码验证的最大问题是它在文化上非常依赖。

    • (408) 974–2042有效美国号码
    • (999) 974–2042 不是有效的美国号码
  • 澳大利亚
    • 0404 999 999有效澳大利亚号码
    • (02) 9999 9999也是有效澳大利亚号码
    • (09) 9999 9999 不是有效澳大利亚号码

正则表达式适用于检查电话号码的格式,但它实际上无法检查电话号码的有效性

我建议您跳过一个简单的正则表达式来测试您的电话号码,并使用Google等libphonenumber (link to GitHub project)等库。

介绍libphonenumber!

使用一个更复杂的示例1-234-567-8901 x1234,您得到the following data out of libphonenumber (link to online demo)

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     true

Formatting Results:

E164 format                    +12345678901
Original format                (234) 567-8901 ext. 123
National format                (234) 567-8901 ext. 123
International format           +1 234-567-8901 ext. 123
Out-of-country format from US  1 (234) 567-8901 ext. 123
Out-of-country format from CH  00 1 234-567-8901 ext. 123

因此,您不仅可以了解电话号码是否有效(它是否有效),还可以在您的语言环境中获得一致的电话号码格式。

作为奖励,libphonenumber还有许多数据集可用于检查电话号码的有效性,因此请检查+61299999999(国际版(02) 9999 9999)等数字返回格式为有效数字:

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     true

Formatting Results

E164 format                    +61299999999
Original format                61 2 9999 9999
National format                (02) 9999 9999
International format           +61 2 9999 9999
Out-of-country format from US  011 61 2 9999 9999
Out-of-country format from CH  00 61 2 9999 9999

libphonenumber还为您提供了许多额外的好处,例如抓住检测到电话号码的位置,以及从电话号码获取时区信息:

PhoneNumberOfflineGeocoder Results
Location        Australia

PhoneNumberToTimeZonesMapper Results
Time zone(s)    [Australia/Sydney]

但无效的澳大利亚电话号码((09) 9999 9999)表示它不是有效的电话号码。

Validation Results

Result from isPossibleNumber()  true
Result from isValidNumber()     false

Google的版本包含Java和Javascript代码,但人们还为使用Google i18n电话号码数据集的其他语言实施了库:

除非你确定你总是要接受一个语言环境中的数字,并且它们总是采用一种格式,否则我会建议不要为此编写自己的代码,并使用libphonenumber进行验证和显示电话号码。

答案 4 :(得分:71)

/^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$/i

匹配:

 - (+351) 282 43 50 50
 - 90191919908
 - 555-8909
 - 001 6867684
 - 001 6867684x1
 - 1 (234) 567-8901
 - 1-234-567-8901 x1234
 - 1-234-567-8901 ext1234
 - 1-234 567.89/01 ext.1234
 - 1(234)5678901x1234
 - (123)8575973
 - (0055)(123)8575973

在$ n上,它会保存:

  1. 国家/地区指标
  2. 电话号码
  3. 扩展
  4. 您可以在https://www.regexpal.com/?fam=99127

    上进行测试

答案 5 :(得分:63)

虽然剥离所有空格的答案很简洁,但它并没有真正解决所提出的问题,即找到一个正则表达式。以我的测试脚本为例,下载网页并使用正则表达式提取所有电话号码。既然你还需要一个正则表达式,你也可以让正则表达式完成所有的工作。我想出了这个:

1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?

这是一个测试它的perl脚本。匹配时,$ 1包含区号,$ 2和$ 3包含电话号码,$ 5包含扩展名。我的测试脚本从互联网上下载文件并打印其中的所有电话号码。

#!/usr/bin/perl

my $us_phone_regex =
        '1?\W*([2-9][0-8][0-9])\W*([2-9][0-9]{2})\W*([0-9]{4})(\se?x?t?(\d*))?';


my @tests =
(
"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",
"not a phone number"
);

foreach my $num (@tests)
{
        if( $num =~ m/$us_phone_regex/ )
        {
                print "match [$1-$2-$3]\n" if not defined $4;
                print "match [$1-$2-$3 $5]\n" if defined $4;
        }
        else
        {
                print "no match [$num]\n";
        }
}

#
# Extract all phone numbers from an arbitrary file.
#
my $external_filename =
        'http://web.textfiles.com/ezines/PHREAKSANDGEEKS/PnG-spring05.txt';
my @external_file = `curl $external_filename`;
foreach my $line (@external_file)
{
        if( $line =~ m/$us_phone_regex/ )
        {
                print "match $1 $2 $3\n";
        }
}

修改

您可以在正则表达式中将\ W *更改为\ s * \ W?\ s *以将其收紧一点。在编写表单时,我没有考虑正则表达式,例如,验证表单上的用户输入,但是这种更改使得为此目的使用正则表达式成为可能。

'1?\s*\W?\s*([2-9][0-8][0-9])\s*\W?\s*([2-9][0-9]{2})\s*\W?\s*([0-9]{4})(\se?x?t?(\d*))?';

答案 6 :(得分:40)

我在另一个SO问题上回答了这个问题,然后决定将我的答案作为答案包含在这个帖子中,因为没有人在解决如何要求/不需要项目,只是分发正则表达式: Regex working wrong, matching unexpected things

从我在该网站上发布的帖子中,我创建了一个快速指南,帮助任何人根据自己想要的电话号码格式制作自己的正则表达式,我会告诫(就像我在其他网站上所做的那样),如果你的限制性太强,你可能无法得到理想的结果,并且没有一种尺寸适合所有人。接受世界上所有可能的电话号码的解决方案 - 只有您决定接受的选择格式。使用风险自负。

快速备忘单

  • 启动表达式:/^
  • 如果您想要一个空格,请使用:[\s]\s
  • 如果您想要括号,请使用:[(][)]。使用\(\)很难看,可能让事情变得混乱。
  • 如果您想要任何内容​​可选,请在其后面添加?
  • 如果您想要连字符,只需输入-[-]即可。但是,如果你不把它放在一系列其他角色的第一个或最后一个,你可能需要逃避它:\-
  • 如果您想在插槽中接受不同的选择,请在选项旁边添加括号:[-.\s]将需要连字符,句点或空格。最后一个括号后面的问号将使该插槽的所有选项都成为可选项。
  • \d{3}:需要一个3位数字:000-999。简写 [0-9][0-9][0-9]
  • [2-9]:该插槽需要数字2-9。
  • (\+|1\s)?:接受"加"或1和空格(竖线字符,|,是"或"),并使其成为可选项。 "加"必须逃脱标志。
  • 如果您希望特定数字与广告位相匹配,请输入:[246]需要2,4或6。[77|78]需要77或78.
  • $/:结束表达

答案 7 :(得分:28)

我写的最简单(虽然我不需要点)。

^([0-9\(\)\/\+ \-]*)$

如下所述,它仅检查字符,而不检查其结构/顺序

答案 8 :(得分:22)

请注意,剥离()字符不适用于编写常用英国数字的方式:+44 (0) 1234 567890表示拨打国际号码:
+441234567890
或在英国拨打01234567890

答案 9 :(得分:21)

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

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

请注意,对于有多少位数或这些数字中有效的数字没有任何特殊规则,它只验证数字,括号,破折号,加号,空格,磅,星号,句号,逗号,或者出现ext字母。

它应与国际号码和本地化格式兼容。您是否预见到某些地区需要允许方形,卷曲或有角度的括号? (目前不包括在内)。

如果你想保持每位数的规则(例如美国区号和前缀(交换代码)必须在200-999范围内),祝你好运。维持世界上任何国家未来任何时候都可能过时的复杂规则集听起来并不好玩。

虽然剥离所有/大多数非数字字符可能在服务器端运行良好(特别是如果您计划将这些值传递给拨号程序),您可能不希望在验证期间抖动用户的输入,特别是如果您希望他们在另一个领域进行更正。

答案 10 :(得分:14)

你有没看过RegExLib

输入美国电话号码带回了很多可能性。

答案 11 :(得分:12)

我尝试不受限制的正则表达式:

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

由您来清理它以进行显示。验证后,可以成为一个数字。

答案 12 :(得分:12)

我发现这很有效:

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

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

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

答案 13 :(得分:11)

如果您正在谈论表单验证,由于国家和提供商的标准不同,用于验证正确含义以及正确数据的正则表达式将变得非常复杂。它也很难保持最新。

我将这个问题解释为寻找一个广泛有效的模式,这个模式可能不是内部一致的 - 例如,有一组有效的数字,但没有验证干线,交换等对于有效的模式。国家代码前缀。

北美是直截了当的,对国际而言,我更喜欢使用“惯用”模式,该模式涵盖了人们指定和记住数字的方式:

^((((\(\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
  • 12 1 1234 123456 x12345
  • +12 1234 1234
  • +12 12 12 1234
  • +12 1234 5678
  • +12 12345678

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

答案 14 :(得分:10)

对这个主题的回复量增强了我的直觉 - 这个问题的解决方案几乎无数,其中没有一个会优雅。

老实说,我建议您不要尝试验证电话号码。即使您可以编写一个允许所有不同合法格式的大型毛茸茸的验证器,它最终也会允许几乎任何东西,甚至远远类似于电话号码。

在我看来,最优雅的解决方案是验证最小长度,仅此而已。

答案 15 :(得分:10)

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

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

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

答案 16 :(得分:9)

这是一个与我需要达到的验证最匹配的精彩模式。我不是原作者,但我认为这很值得分享,因为我发现这个问题非常复杂,没有简洁或广泛有用的答案。

以下正则表达式将捕获各种全球电话号码格式中广泛使用的数字和字符组合:

/^\s*(?:\+?(\d{1,3}))?([-. (]*(\d{3})[-. )]*)?((\d{3})[-. ]*(\d{2,4})(?:[-.x ]*(\d+))?)\s*$/gm

正:
+42 555.123.4567
+ 1-(800)-123-4567
+7 555 1234567
+7(926)1234567
(926)1234567
79261234567
926 1234567
9261234567个
1234567个
123-4567
123-89-01
495 1234567
469 123 45 67
89261234567
8(926)1234567
926.123.4567
415-555-1234
650-555-2345
(416)555-3456
202 555 4567
4035555678个
1 416 555 9292

阴性:
926 3 4
8 800 600-APPLE

原始来源:http://www.regexr.com/38pvb

答案 17 :(得分:9)

使用单一/简单正则表达式处理国际号码会很困难,请参阅this post有关国际(甚至是北美)电话号码的困难。

您需要解析前几位数字以确定国家/地区代码是什么,然后根据国家/地区采取不同的行动。

除此之外 - 您提供的列表不包括另一种常见的美国格式 - 从最初的1开始。美国的大多数手机都不需要它,并且它会开始让年轻一代感到困惑,除非他们已经在国际上拨打过电话。

你已经正确地发现这是一个棘手的问题......

- 亚当

答案 18 :(得分:8)

在阅读完这些答案之后,看起来似乎没有一个简单的正则表达式可以解析一堆文本并以任何格式提取电话号码(包括带有和不带加号的国际电话号码)。

以下是我最近用于客户项目的内容,我们必须将所有格式的电话号码转换为tel:links。

到目前为止,它一直在处理他们所投入的所有内容,但如果出现错误,我会更新此答案。

正则表达式:

/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/

PHP函数用tel:links替换所有电话号码(如果有人好奇的话):

function phoneToTel($number) {
    $return = preg_replace('/(\+*\d{1,})*([ |\(])*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})/', '<a href="tel:$1$3$4$5">$1 ($3) $4-$5</a>', $number); // includes international
    return $return;
}

答案 19 :(得分:8)

到目前为止,这是我最好的尝试。它处理上述格式,但我确定我缺少其他一些可能的格式。

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

答案 20 :(得分:6)

我相信Number::Phone::USRegexp::Common(特别是Regexp::Common::URI::RFC2806} Perl模块的来源可以提供帮助。

应该更详细地说明问题,以解释验证数字的目的。例如,911在美国是有效数字,但911x不是任何x值。这样,电话公司可以在您完成拨号时进行计算。这个问题有几个变种。但是你的正则表达式没有检查区域代码部分,所以这似乎不是一个问题。

与验证电子邮件地址一样,即使您拥有有效的结果,在尝试之前也无法知道它是否已分配给某人。

如果您正在尝试验证用户输入,为什么不对结果进行标准化并完成它?如果用户输入的号码无法识别为有效号码,请将其保存为输入或删除不可用的字符。 Number::Phone::Normalize Perl模块可能是灵感的源泉。

答案 21 :(得分:4)

我在一家市场研究公司工作,我们必须及时过滤这些类型的输入。你太复杂了。只需删除非字母数字字符,看看是否有扩展名。

如需进一步分析,您可以订阅许多提供商中的一个,这些提供商可以让您访问有效号码的数据库,并告诉您它们是固定电话还是移动电话,断开连接等。这需要花钱。

答案 22 :(得分:4)

替换格式化字符,然后检查剩余的电话有效性。在PHP中,

 $replace = array( ' ', '-', '/', '(', ')', ',', '.' ); //etc; as needed
 preg_match( '/1?[0-9]{10}((ext|x)[0-9]{1,4})?/i', str_replace( $replace, '', $phone_num );

打破像这样的复杂正则表达式可以同样有效,但更简单。

答案 23 :(得分:3)

这是一个适用于JavaScript的方法。它在字符串中,因为这是Dojo小部件所期望的。

它匹配10位北美NANP号码和可选扩展名。空格,短划线和句点是接受的分隔符。

"^(\\(?\\d\\d\\d\\)?)( |-|\\.)?\\d\\d\\d( |-|\\.)?\\d{4,4}(( |-|\\.)?[ext\\.]+ ?\\d+)?$"

答案 24 :(得分:3)

为此,您可能最好使用蒙面输入。这样,用户只能输入数字,您可以根据自己的需要进行格式化。我不确定这是否适用于Web应用程序,但是如果它是一个非常单击的jQuery插件,它提供了一些选项来执行此操作。

http://digitalbush.com/projects/masked-input-plugin/

他们甚至会在教程中讨论如何屏蔽电话号码输入。

答案 25 :(得分:3)

我觉得这很有意思。我没有测试过,但它看起来好像可以工作

<?php
/*
string validate_telephone_number (string $number, array $formats)
*/

function validate_telephone_number($number, $formats)
{
$format = trim(ereg_replace("[0-9]", "#", $number));

return (in_array($format, $formats)) ? true : false;
}

/* Usage Examples */

// List of possible formats: You can add new formats or modify the existing ones

$formats = array('###-###-####', '####-###-###',
                 '(###) ###-###', '####-####-####',
                 '##-###-####-####', '####-####', '###-###-###',
                 '#####-###-###', '##########');

$number = '08008-555-555';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '123-555-555';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '1800-1234-5678';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '(800) 555-123';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}

echo "<br />";

$number = '1234567890';

if(validate_telephone_number($number, $formats))
{
echo $number.' is a valid phone number.';
}
?>

答案 26 :(得分:3)

我正在努力解决同样的问题,试图让我的应用程序未来证明,但这些人让我朝着正确的方向前进。我实际上并没有检查数字本身以查看它是否有效,我只是想确保输入了一系列可能有或没有扩展名的数字。

最糟糕的情况是,如果用户必须从XML文件中提取未格式化的数字,他们仍然只需将数字键入手机的数字键盘012345678x5,没有任何理由让它保持漂亮。那种RegEx对我来说会是这样的:

\d+ ?\w{0,9} ?\d+
  • 01234467 extension 123456
  • 01234567x123456
  • 01234567890

答案 27 :(得分:2)

我倾向于同意剥离非数字并且只接受最好的数字。也许确保至少有几个数字,但这确实禁止像字母电话号码“ASK-JAKE”这样的东西。

一些简单的perl表达式可能是:

@f = /(\d+)/g;
tr/0-9//dc;

使用第一个将数字组保持在一起,这可能会给出格式化线索。使用第二个来轻易地抛弃所有非数字。

是否担心可能需要暂停,然后输入更多密钥?或类似555-1212(等待哔哔声)123?

答案 28 :(得分:2)

对于有兴趣与爱尔兰移动电话号码做类似事情的人来说,这是一种直接的方式来完成它:

http://ilovenicii.com/?p=87

PHP


<?php
$pattern = "/^(083|086|085|086|087)\d{7}$/";
$phone = "087343266";

if (preg_match($pattern,$phone)) echo "Match";
else echo "Not match";

该链接上还有一个JQuery解决方案。

编辑:

jQuery解决方案:

    $(function(){
    //original field values
    var field_values = {
            //id        :  value
            'url'       : 'url',
            'yourname'  : 'yourname',
            'email'     : 'email',
            'phone'     : 'phone'
    };

        var url =$("input#url").val();
        var yourname =$("input#yourname").val();
        var email =$("input#email").val();
        var phone =$("input#phone").val();


    //inputfocus
    $('input#url').inputfocus({ value: field_values['url'] });
    $('input#yourname').inputfocus({ value: field_values['yourname'] });
    $('input#email').inputfocus({ value: field_values['email'] }); 
    $('input#phone').inputfocus({ value: field_values['phone'] });



    //reset progress bar
    $('#progress').css('width','0');
    $('#progress_text').html('0% Complete');

    //first_step
    $('form').submit(function(){ return false; });
    $('#submit_first').click(function(){
        //remove classes
        $('#first_step input').removeClass('error').removeClass('valid');

        //ckeck if inputs aren't empty
        var fields = $('#first_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<12 || value==field_values[$(this).attr('id')] ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }
        });        

        if(!error) {
            if( $('#password').val() != $('#cpassword').val() ) {
                    $('#first_step input[type=password]').each(function(){
                        $(this).removeClass('valid').addClass('error');
                        $(this).effect("shake", { times:3 }, 50);
                    });

                    return false;
            } else {   
                //update progress bar
                $('#progress_text').html('33% Complete');
                $('#progress').css('width','113px');

                //slide steps
                $('#first_step').slideUp();
                $('#second_step').slideDown();     
            }               
        } else return false;
    });

    //second section
    $('#submit_second').click(function(){
        //remove classes
        $('#second_step input').removeClass('error').removeClass('valid');

        var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;  
        var fields = $('#second_step input[type=text]');
        var error = 0;
        fields.each(function(){
            var value = $(this).val();
            if( value.length<1 || value==field_values[$(this).attr('id')] || ( $(this).attr('id')=='email' && !emailPattern.test(value) ) ) {
                $(this).addClass('error');
                $(this).effect("shake", { times:3 }, 50);

                error++;
            } else {
                $(this).addClass('valid');
            }


        function validatePhone(phone) {
        var a = document.getElementById(phone).value;
        var filter = /^[0-9-+]+$/;
            if (filter.test(a)) {
                return true;
            }
            else {
                return false;
            }
        }

        $('#phone').blur(function(e) {
            if (validatePhone('txtPhone')) {
                $('#spnPhoneStatus').html('Valid');
                $('#spnPhoneStatus').css('color', 'green');
            }
            else {
                $('#spnPhoneStatus').html('Invalid');
            $('#spnPhoneStatus').css('color', 'red');
            }
        });

     });

        if(!error) {
                //update progress bar
                $('#progress_text').html('66% Complete');
                $('#progress').css('width','226px');

                //slide steps
                $('#second_step').slideUp();
                $('#fourth_step').slideDown();     
        } else return false;

    });


    $('#submit_second').click(function(){
        //update progress bar
        $('#progress_text').html('100% Complete');
        $('#progress').css('width','339px');

        //prepare the fourth step
        var fields = new Array(
            $('#url').val(),
            $('#yourname').val(),
            $('#email').val(),
            $('#phone').val()

        );
        var tr = $('#fourth_step tr');
        tr.each(function(){
            //alert( fields[$(this).index()] )
            $(this).children('td:nth-child(2)').html(fields[$(this).index()]);
        });

        //slide steps
        $('#third_step').slideUp();
        $('#fourth_step').slideDown();            
    });


    $('#submit_fourth').click(function(){

        url =$("input#url").val();
        yourname =$("input#yourname").val();
        email =$("input#email").val();
        phone =$("input#phone").val();

        //send information to server
        var dataString = 'url='+ url + '&yourname=' + yourname + '&email=' + email + '&phone=' + phone;  



        alert (dataString);//return false;  
            $.ajax({  
                type: "POST",  
                url: "http://clients.socialnetworkingsolutions.com/infobox/contact/",  
                data: "url="+url+"&yourname="+yourname+"&email="+email+'&phone=' + phone,
                cache: false,
                success: function(data) {  
                    console.log("form submitted");
                    alert("success");
                }
                });  
        return false;

   });


    //back button
    $('.back').click(function(){
        var container = $(this).parent('div'),
        previous  = container.prev();

        switch(previous.attr('id')) {
            case 'first_step' : $('#progress_text').html('0% Complete');
                  $('#progress').css('width','0px');
                       break;
            case 'second_step': $('#progress_text').html('33% Complete');
                  $('#progress').css('width','113px');
                       break;

            case 'third_step' : $('#progress_text').html('66% Complete');
                  $('#progress').css('width','226px');
                       break;

        default: break;
    }

    $(container).slideUp();
    $(previous).slideDown();
});


});

Source

答案 29 :(得分:2)

    pattern="^[\d|\+|\(]+[\)|\d|\s|-]*[\d]$" 
    validateat="onsubmit"

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

开头

答案 30 :(得分:1)

虽然它不是正则表达式,但您可以使用 Python 库 validate_phone() 中的函数 DataPrep 来验证美国电话号码。使用 pip install dataprep 安装。

>>> from dataprep.clean import validate_phone
>>> df = pd.DataFrame({'phone': ['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, '12345678', '123-456-78987']})
>>> validate_phone(df['phone'])
0     True
1     True
2     True
3     True
4     True
5     True
6     True
7    False
8    False
Name: phone, dtype: bool

答案 31 :(得分:1)

由于此帖没有语言标记,我将在python中使用regex解决方案。

表达本身:

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

答案 32 :(得分:1)

查找String regex = "^\\+(?:[0-9] ?){6,14}[0-9]$";

对国际号码有帮助。

答案 33 :(得分:1)

使用简单的正则表达式几乎无法处理各种国际电话号码。

您最好使用 numverify.com 等服务,他们会提供免费的JSON API以进行国际电话号码验证,此外您还可以每个请求都可获得有关国家/地区,位置,运营商和线路类型的有用详细信息

答案 34 :(得分:1)

是否可以显示4个单独的字段(区号,3位前缀,4位数部分,扩展名),以便它们可以分别输入地址的每个部分,并且您可以单独验证每个部分?这样,您不仅可以更轻松地进行验证,还可以在数据库中以更一致的格式存储您的电话号码。

答案 35 :(得分:1)

土耳其的工作示例,只需更改

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

答案 36 :(得分:1)

我不建议使用正则表达式。

与最常见的答案一样,请从电话号码中删除所有丑陋内容,这样您就会留下一串数字字符,如果提供了扩展程序,则会'x'

在Python中:

注意:BAD_AREA_CODES来自text file,您可以从网上抓取。

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

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

答案 37 :(得分:0)

注意它以任何格式输入美国移动电话号码,并可选择接受第二个参数 - 如果您希望输出的移动电话号码看起来很漂亮,请设置为true。如果提供的号码不是手机号码,则简单返回false。如果检测到手机号码,则返回整个已清理的号码而不是真。

    function isValidMobile(num,format) {
        if (!format) format=false
        var m1 = /^(\W|^)[(]{0,1}\d{3}[)]{0,1}[.]{0,1}[\s-]{0,1}\d{3}[\s-]{0,1}[\s.]{0,1}\d{4}(\W|$)/
        if(!m1.test(num)) {
           return false
        }
        num = num.replace(/ /g,'').replace(/\./g,'').replace(/-/g,'').replace(/\(/g,'').replace(/\)/g,'').replace(/\[/g,'').replace(/\]/g,'').replace(/\+/g,'').replace(/\~/g,'').replace(/\{/g,'').replace(/\*/g,'').replace(/\}/g,'')
        if ((num.length < 10) || (num.length > 11) || (num.substring(0,1)=='0') || (num.substring(1,1)=='0') || ((num.length==10)&&(num.substring(0,1)=='1'))||((num.length==11)&&(num.substring(0,1)!='1'))) return false;
        num = (num.length == 11) ? num : ('1' + num);   
        if ((num.length == 11) && (num.substring(0,1) == "1")) {
            if (format===true) {
               return '(' + num.substr(1,3) + ') ' + num.substr(4,3) + '-' + num.substr(7,4)
            } else {
               return num
            }
        } else {
            return false;
        }
    }

答案 38 :(得分:0)

试试这个(这是印度手机号验证):

if (!phoneNumber.matches("^[6-9]\\d{9}$")) {
  return false;
} else {
  return true;
}

答案 39 :(得分:0)

我发现使用正则表达式的电话号码验证过于严格或过于宽松。我发现最合适的平衡点是

^([+])?([^\\d]?\\d){5,18}$

它将允许5到18位数字,数字之间最多1个字符(如空格或破折号)。

最后,我退出使用正则表达式,开始使用Veriphone

答案 40 :(得分:0)

这是我用的

function isValidTel ($tel) {
    preg_match('/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im', $tel, $matches);
    return !! $matches;
}

在此正则表达式测试器https://www.phpliveregex.com/p/uld中查看

答案 41 :(得分:0)

Java为有效的电话号码生成REGEX

另一种选择是让Java生成一个REGEX,该REGEX可以处理从列表中读取的电话号码的所有变体。这意味着在代码上下文中如下所示,名为validPhoneNumbersFormat的列表正在确定哪种电话号码格式有效。

注意:这种算法适用于处理正则表达式的任何语言。

生成REGEX的代码段:

Set<String> regexSet = uniqueValidPhoneNumbersFormats.stream()
        .map(s -> s.replaceAll("\\+", "\\\\+"))
        .map(s -> s.replaceAll("\\d", "\\\\d"))
        .map(s -> s.replaceAll("\\.", "\\\\."))
        .map(s -> s.replaceAll("([\\(\\)])", "\\\\$1"))
        .collect(Collectors.toSet());

String regex = String.join("|", regexSet);

上下文中的代码段:

public class TestBench {

    public static void main(String[] args) {
        List<String> validPhoneNumbersFormat = Arrays.asList(
                "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",
                "+12345678901",
                "(234) 567-8901 ext. 123",
                "+1 234-567-8901 ext. 123",
                "1 (234) 567-8901 ext. 123",
                "00 1 234-567-8901 ext. 123",
                "+210-998-234-01234",
                "210-998-234-01234",
                "+21099823401234",
                "+210-(998)-(234)-(01234)",
                "(+351) 282 43 50 50",
                "90191919908",
                "555-8909",
                "001 6867684",
                "001 6867684x1",
                "1 (234) 567-8901",
                "1-234-567-8901 x1234",
                "1-234-567-8901 ext1234",
                "1-234 567.89/01 ext.1234",
                "1(234)5678901x1234",
                "(123)8575973",
                "(0055)(123)8575973"
        );

        Set<String> uniqueValidPhoneNumbersFormats = new LinkedHashSet<>(validPhoneNumbersFormat);

        List<String> invalidPhoneNumbers = Arrays.asList(
                "+210-99A-234-01234",       // FAIL
                "+210-999-234-0\"\"234",    // FAIL
                "+210-999-234-02;4",        // FAIL
                "-210+998-234-01234",       // FAIL
                "+210-998)-(234-(01234"     // FAIL
        );
        List<String> invalidAndValidPhoneNumbers = new ArrayList<>();
        invalidAndValidPhoneNumbers.addAll(invalidPhoneNumbers);
        invalidAndValidPhoneNumbers.addAll(uniqueValidPhoneNumbersFormats);

        Set<String> regexSet = uniqueValidPhoneNumbersFormats.stream()
                .map(s -> s.replaceAll("\\+", "\\\\+"))
                .map(s -> s.replaceAll("\\d", "\\\\d"))
                .map(s -> s.replaceAll("\\.", "\\\\."))
                .map(s -> s.replaceAll("([\\(\\)])", "\\\\$1"))
                .collect(Collectors.toSet());

        String regex = String.join("|", regexSet);

        List<String> result = new ArrayList<>();
        Pattern pattern = Pattern.compile(regex);
        for (String phoneNumber : invalidAndValidPhoneNumbers) {
            Matcher matcher = pattern.matcher(phoneNumber);
            if(matcher.matches()) {
                result.add(matcher.group());
            }
        }

        // Output:
        if(uniqueValidPhoneNumbersFormats.size() == result.size()) {
            System.out.println("All valid numbers was matched!\n");
        }    
        result.forEach(System.out::println); 
    }

}

输出:

All valid numbers was matched!

1-234-567-8901
1-234-567-8901 x1234
1-234-567-8901 ext1234
...
...
...

答案 42 :(得分:-2)

由于写电话号码的方法很多, 不管它们如何分开,都可以测试其中是否有足够的数字。我发现9到14位数字对我有用:

^\D*(\d\D*){9,14}$

true:

  • 123456789
  • 1234567890123
  • +123(456)78.90-98.76

false:

  • 123
  • (1234)1234
  • 9007199254740991
  • 123不会照你说的做
  • +123(456)78.90-98.76#543分机210> 2> 5> 3
  • (123)456-7890,于18:00后早上(987)54-3210询问雪莉

如果您希望支持后两个示例-只需删除上限:

(\d\D*){9,}

(如果没有上限,则不需要^$

答案 43 :(得分:-4)

/\b(\d{3}[^\d]{0,2}\d{3}[^\d]{0,2}\d{4})\b/