好的,我一直在使用以下正则表达式来匹配国家和国际的电话号码:
$regex = "^(?!(?:\d*-){5,})(?!(?:\d* ){5,})\+?[\d- ]+$";当然,我已经在regex101上测试过这个正则表达式。正如我所期望的那样。
下面是我将其实现到代码中的部分:
<?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个键。
发布于 2015-08-20 14:12:15
好吧,实话实说:
有些人使用父母。有些人在不同的地方使用空间。有些人使用点和/或破折号。有些人可能会或不实际地放一个+。
除此之外,确保号码真实的唯一方法是拿起电话并拨它。
你能为你的访客和你自己的理智做的最好的事情,就是不要试图强迫或匹配格式。说到底,唯一重要的是数字。
如果您确实希望将数字分隔开来以了解组件,请为它们创建单独的输入字段。但是,您甚至会在数据库中将其拆分为单独的字段吗?我很少看到人们真的这么做。
帮你自己和你的访客一个忙:去掉任何不是数字的东西,用一个简单的strlen检查它是否像一个合适的长度,然后就说一天吧。
https://stackoverflow.com/questions/32120372
复制相似问题