北美电话号码的正则表达式

时间:2018-01-17 20:44:42

标签: php regex

我有一个以下正则表达式来验证北美数字。它工作正常,但我有小问题。 这是我的代码&正则表达式:

$re = '/^\+(1)(((?!900)(?!976)[2-9][0-9]{2})((?!555)[2-9](?!11)[0-9]{2})[0-9]{4}$|\\\\+18([0,3-8])3((?!555)[2-9][0-9]{2})[0-9]{4})$/';
$str = '+18009876543';

preg_match($re, $str, $matches);
print_r($matches);

它返回总共4场比赛,但我只想要3场即完全比赛,group1(它将包含国家代码)&第2组(10位数的电话号码)。

这就是我得到的:

Array ( [0] => +18009876543 [1] => 1 [2] => 8009876543 [3] => 800 [4] => 987 )

但我想要这个:

Array ( [0] => +18009876543 [1] => 1 [2] => 8009876543 )

1 个答案:

答案 0 :(得分:0)

/^\+(?:1)((?:(?!900)(?!976)[2-9][0-9]{2})(?:(?!555)[2-9](?!11)[0-9]{2})[0-9]{4})$|\\\\+18(?:[0,3-8])3(?:(?!555)[2-9][0-9]{2})[0-9]{4}$/

在PHP中:

<?php
$re = '/^\+(?:1)((?:(?!900)(?!976)[2-9][0-9]{2})(?:(?!555)[2-9](?!11)[0-9]{2})[0-9]{4})$|\\\\+18(?:[0,3-8])3(?:(?!555)[2-9][0-9]{2})[0-9]{4}$/';
$str = '+18009876543';

preg_match($re, $str, $matches);
print_r($matches);

我使用?:制作了一些非捕获组以实现此目的:

https://regex101.com/r/EfJ81h/1