首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >电话号码regex返回匹配和不匹配的同一字符串?

电话号码regex返回匹配和不匹配的同一字符串?
EN

Stack Overflow用户
提问于 2015-08-20 14:01:51
回答 1查看 160关注 0票数 0

好的,我一直在使用以下正则表达式来匹配国家和国际的电话号码:

代码语言:javascript
复制
$regex = "^(?!(?:\d*-){5,})(?!(?:\d* ){5,})\+?[\d- ]+$";

当然,我已经在regex101上测试过这个正则表达式。正如我所期望的那样。

下面是我将其实现到代码中的部分:

代码语言:javascript
复制
<?php

//Check for valid Telephone Number (takes international numbers into account)
function phoneRegex($var){
    if(!preg_match("/^(?!(?:\d*-){5,})(?!(?:\d* ){5,})\+?[\d- ]+$/", $var)){
        return false;
    } else {
        return true;
    }
}

if(phoneRegex($_POST['phone'])){
    $error .= "The phone number is incorrect.";
}

?>

The Issue

现在,每当我用普通的数字键键入: 0123456789时,函数返回false。如果我使用numpad键键入相同的内容,它将返回true。我试着回显$_POST['phone'],看看是否有什么不同,但没有,两者都返回字符串0123456789。我应该补充一点,我已经通过Javascript警报回显这些内容,以确保字符串以纯文本的形式返回。有人能告诉我发生了什么事吗?

编辑

有人提到了一个不同的问题的关键代码,以标记这是一个副本。键码是用来检测准确地按下哪个键的。但是,这对这些键的ASCII值没有影响。例如,键盘上顶部键中的5与数字垫上的5有不同的键码。但是,两者都具有相同的ASCII值。因此,这个问题的解决方案/答案与密钥无关。

ASCII调试信息

当我用最高数字键调试"0123456789“时,它返回:

键1具有ascii值: 48 密钥2具有ascii值: 49 密钥3具有ascii值: 50 键4具有ascii值: 51 密钥5具有ascii值: 52 密钥6具有ascii值: 53 密钥7具有ascii值: 54 密钥8有ascii值: 55 密钥9具有ascii值: 56 密钥10具有ascii值: 57

在用数字键盘调试"0123456789“之后,它返回:

键1具有ascii值: 48 密钥2具有ascii值: 49 密钥3具有ascii值: 50 键4具有ascii值: 51 密钥5具有ascii值: 52 密钥6具有ascii值: 53 密钥7具有ascii值: 54 密钥8有ascii值: 55 密钥9具有ascii值: 56 密钥10具有ascii值: 57 密钥11具有ascii值: 60 密钥12具有ascii值: 98 密钥13具有ascii值: 114 密钥14具有ascii值: 62

因此,在使用numpad时,似乎还会向字符串中添加4个键。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-20 14:12:15

好吧,实话实说:

有些人使用父母。有些人在不同的地方使用空间。有些人使用点和/或破折号。有些人可能会或不实际地放一个+。

除此之外,确保号码真实的唯一方法是拿起电话并拨它。

你能为你的访客和你自己的理智做的最好的事情,就是不要试图强迫或匹配格式。说到底,唯一重要的是数字。

如果您确实希望将数字分隔开来以了解组件,请为它们创建单独的输入字段。但是,您甚至会在数据库中将其拆分为单独的字段吗?我很少看到人们真的这么做。

帮你自己和你的访客一个忙:去掉任何不是数字的东西,用一个简单的strlen检查它是否像一个合适的长度,然后就说一天吧。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32120372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档