我需要验证一个表格,在这个表格中我有一个输入电话号码的字段。
根据维基百科阿根廷电话号码,我引用:
区号可以是 2、3 或 4 位数字,其余 6、7 或 8 位数字是本地电话号码。
例如,
+54 11 1234-5678
布宜诺斯艾利斯的号码由 2 位数的区号和 8 位数的电话号码组成;而这+54 341 123-4567
将是罗萨里奥数的一个例子。
简而言之,您需要一个涵盖所有这些情况的正则表达式。我需要向它添加一个规则,那就是它+54
是可选的。
目前,我将此表达式用作最后一个选项:
/^\(?\d{2}\)?[\s\.-]?\d{4}[\s\.-]?\d{4}$/
但这不是我要找的,因为这允许(11) 1234 3434
or1123243434
等。例如,我需要添加上面解释的规则并将其(353) 123 4345
设为+54
可选
我们可以选择通过 2 种方式进行验证:
1.简单的方法:删除所有不是数字的东西。
检查阿根廷电话号码是否有效的直接方法是从字符串中删除所有不是数字的内容并验证它是否有 10 位数字(加上前缀作为可选)。
(不以没有区号的本地号码为有效
4444-0000
)代码:
2.分析数字的每个部分
相反,如果我们有兴趣进行更详尽的验证,但同时提取构成数字的每个部分,那么我们将使用更长更严格的正则表达式:
不要被正则表达式的长度所迷惑:它基本上是可选分隔符(括号、空格、连字符或句点)的重复,以验证它们是我们通常使用的格式之一。仅仅因为它是一个长的正则表达式并不会降低它的效率。
用Debuggex图解释(在另一个选项卡中打开图像以查看 100%):
特征:
+54
:0054
或54
.11
(+ 8 位数字)2xx
和3xx
(+ 7 位),或2xxx
和3xxx
(+ 6 位)06xx
和08xx
(+ 7 位数字,仅当使用0
or时54
)15
手机(如果9
在国际代码后不使用)。-
。.
-
.
11-4-333-0000
这个表达式的优点是它允许我们使用组来分别返回每个部分。也就是我们可以把函数的结果当作真/假,或者把它赋值给一个变量,分别得到数字的每一部分。
代码
例子:
*注意:如果号码中没有使用分隔符,它可能会误分隔成
area
3 位数的区号,例如343
(Paraná),而不是 4 位数的区号3436
(Victoria)。但是那个6
并没有丢失,它显示为 的第一个数字local_1
,并且numero
您会得到3436xxyyyy
...随着时间的推移会创建新的区号,正确区分它的唯一方法是与不断更新的列表进行比较。但是,对于大多数用例来说,通过区分它是 4 位区号还是本地号码的一部分来很好地分离该数字通常是无关紧要的。测试
>>> Ideone和regex101中的演示
正则表达式解释(仅适用于粉丝)
备择方案:
对于这种情况,我更喜欢这种类型的手动验证,但您可能更容易使用以下解决方案之一:
来自 Google 的libphonenumber (移植到 PHP:PHP的 libphonenumber -演示)。
Twilio Lookup(需要您注册的 REST API - 验证和格式化查询是免费的) -代码示例。
用于 JavaScript的 intl-tel-input(使用 libphonenumber 进行表单验证的 jQuery 插件) - cdnjs -教程
或者,您可以从 ENACOM 网站下载分配号码的完整列表,并检查呼号及其块是否存在。