匹配长度在8-16位之间的电话号码,忽略()+ -

时间:2015-12-14 13:08:21

标签: regex

请考虑以下事项:

+12 34 456 432
(12) 34 567 124
1234 56 78 90
(1234) 567 890
1234-567-890
1234 - 567 - 890
12 34 56 78
12-34-56-78

假设这些都是有效的电话号码结构

可以使用正则表达式来表达:找到至少8个数字,但不超过16个并忽略空格,圆括号,加号(一次)和减号。

我目前的工作样本一团糟:

^([\+|\(]{1,2})?+(\d{2,4})+([ |-|\)]{1,2})?+(\d{2,3})+([ |-]{1})?+(\d{2,3})+([ |-]{1})?+(\d{2,3})?$

即使建议使用电话号码验证。这些东西没有更简单的正则表达式语法吗?

4 个答案:

答案 0 :(得分:1)

这可以减轻您的任务。

首先,删除不是数字的所有内容:

myString = myString.replace(/\D/g,'');

你会得到这个:

1234456432
1234567124
1234567890
1234567890
1234567890
1234567890
12345678
12345678

然后检查长度:

if(myString.length >= 0 && myString.length <=16)
// Do stuff

答案 1 :(得分:1)

要仅计算-)(或空格(在开头允许+)的位数和内容,您可以使用以下正则表达式:

^\+?(?:[ ()-]*\d){8,16}$

匹配

  • ^ - 字符串开头
  • \+? - 一个或零+
  • (?:[ ()-]*\d){8,16} - 8到16个序列......
    • [ ()-]* - 0个或更多-)(或空格字符
    • \d - 数字
  • $ - 字符串结尾

请参阅regex demo

答案 2 :(得分:0)

仅使用preg_replace获取数字,检查有效长度

<?php       
$ph = "(12) 34 567 124";
$len = strlen(preg_replace('/[^0-9]+/', '', $ph));
if($len >=8 && $len <=16)
    echo "Valid";
else 
    echo "Invalid";

答案 3 :(得分:0)

甚至不要考虑它。电话号码很复杂。他们非常复杂。谷歌有一个像样的库来处理名为libPhoneNumber的电话号码。

请原谅,但是忽略“+”会让你完全无所事事,完全错了。加号之后是某个国家/地区的国家/地区代码,然后是该国家/地区的本地电话号码(需要根据该国家/地区的规则进行解析,大约有200个)。如果没有“+”,则根据当地规则提供电话号码,您需要找出适用的本地规则。这意味着您的号码可以从拨打外汇的代码开始,而不是“+”,否则根据当地规则进行格式化。

因此,一个数字可能对“+”有效而没有它则无效,反之亦然,并且很可能是指在有或没有“+”的完全不同国家的不同实际手机。