我购买了一份联系表格。很棒的小东西,但我需要转换电话号码的验证,以允许英国数字格式 - 换句话说,允许空格。
现在它验证没有空格,最小长度为8个字符:
if(is_numeric($phone))
{
if(!$phone || strlen($phone) < 8)
{
$error .= "Please enter your phone number without spaces.<br />";
}
}
else
{
$error .= "Please enter numeric characters in the phone number field.<br />";
}
答案 0 :(得分:6)
正则表达式的电话号码通常很糟糕,这正是您所需要的。
这种模式例如:
$pattern = "/^(\+44\s?7\d{3}|\(?07\d{3}\)?)\s?\d{3}\s?\d{3}$/";
$match = preg_match($pattern,$input);
if ($match != false) {
// We have a valid phone number
} else {
// We have an invalid phone number
}
该模式将与包含的+44匹配或不匹配。
所有这些都匹配:
07222 555555
(07222) 555555
+44 7222 555 555
这些胜利
7222 555555
+44 07222 555555
(+447222) 555555
有很多站点提供教程/备忘单等正则表达式尝试其中一些:
http://regexlib.com/Default.aspx
以及非常好的堆栈溢出帖子:
答案 1 :(得分:2)
所以你只想留空间?
然后你可以使用str_replace()
忽略空格,就在开头:
$phone = str_replace(' ', '', $phone);
答案 2 :(得分:1)
The is_numeric
function对于美国电话号码来说甚至不是一个合适的选择。例如,它接受像0xABCDEF
这样的十六进制数字,它应该拒绝。
对于像这样的简单文本匹配,正则表达式通常是最简单的解决方案。正则表达式指定文本模式。 PHP具有允许您在文本中搜索或替换正则表达式匹配的功能。
如果您将电话号码定义为至少包含数字和空格的7个字符的字符串,则相应的正则表达式将为/^[0-9 ]{7,}$/
。括号内的文字代表一组字符,{7,}
表示我们连续查找其中至少7个字符,而^
和$
表示我们的字符match应该从字符串的开头开始并在字符串的结尾处结束。 PHP文档has a section explaining regular expressions in greater detail。
您可以使用the preg_match
function
确保电话号码匹配:
if (preg_match('/^[0-9 ]{7,}$/', $phone)) {
答案 3 :(得分:1)
这匹配所有英国格式的各种标点符号:
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{5}\)?[\s-]?\d{4,5}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$
使用此模式提取各个部分
^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)(44)\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d-]+)(?:((?:x|ext\.?\s?|\#)\d+)?)$
国家/地区代码为1美元(国家格式为空)。 NSN是2美元。可选的扩展名为3美元。
从$ 2中删除所有非数字以进行进一步处理。下一步是确保NSN处于有效范围内并且是有效长度(9或10位数,具体取决于范围)。
模式列表太长,无法在此处重现,但可在以下位置获取:
答案 4 :(得分:0)
您可以将输入解析为整数,然后验证正确的位数;
$mobileNumber = intval($mobileNumber);
if (preg_match('/(^\d{12}$)|(^\d{10}$)/',$mobileNumber)==TRUE) {
//number has the right number of digits for a UK mobile number
} else {
//number does not have the right number of digits
}
解释
$ mobileNumber = intval($ mobileNumber);
这将删除字符串中的所有非数字字符,并且前导零(例如空格,括号,加号,小数等);
* if(preg_match('/(^ \ d {12} $)|(^ \ d {10} $)/',$ mobileNumber)== TRUE){*
然后,此正则表达式检查该字符串是否包含12或10位数字,这些数字将覆盖447712345678(12位数)或7791234567(10位数)。它在两个子句(^ \ d {12} $)或(^ \ d {10} $)中匹配,克拉(^)和美元($)表示从一开始(^)到非常结束($)的字符串。 \ d表示任何数字,以下{12}表示匹配前一个语句的次数。
这并不意味着该数字有效,您可以使用像twillio这样的API对数字进行额外验证https://www.twilio.com/help/faq/sms/does-twilio-check-to-see-if-phone-numbers-can-receive-sms
例如;
$mobileNumber = '+447791234567';
$mobileNumber = intval($mobileNumber); //$mobileNumber is now 447791234567
if (preg_match('/(^\d{12}$)|(^\d{10}$)/',$mobileNumber)==TRUE) {
//$mobileNumber matches (^\d{12}$) and is valid
}
您还可以添加支票,以确保该号码以英国手机所需的“07”或“447”开头,就像这样;
function isValidMobile($aNumber){
$aNumber = intval($aNumber);
return preg_match('/(^\d{12}$)|(^\d{10}$)/', $aNumber) && preg_match('/(^7)|(^447)/', $aNumber);
}
intval删除前导零,因此正则表达式检查leadin 7或447。
答案 5 :(得分:0)
我已经根据[here] [1]中提到的标准找到了使用javascript的解决方案。**它不是正则表达式。**如果您使用的是此解决方案,则需要注意三件事
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script >
var name=window.prompt("Enter cell number");
var sixformat=["013397","013398","013873","015242","015394","015395","015396","016973","016974","017683","017684","017687","019467","019755","019756"];
var twoformat=["01","02","03","05","07","08","09"];
sixdi=name.substring(0,6);
twodi=name.substring(0,2);
document.write("phone number:",name,"<br>");
document.write("phone-number length:",name.length);
if(sixformat.includes(sixdi)&&name.length==11)
{
document.write("<br><h1>valid</h1>");
}
else if(sixdi=="016977"&&name.length==10)
{
document.write("<br><h1>valid<h1>");
}
else if(twoformat.includes(twodi)&&(name.length==11))//011########
{
document.write("<br><h1>valid</h1>");
}
else if(twodi=="01"&&(name.length==10))
{
document.write("<br><h1>valid</h1>");
}
else if(name.substring(0,4)=="0800"&&(name.length==10))
{
document.write("<br><h1>Valid</h1></br>");
}
else
{
document.write("<h1>invalid</h1>");
}
</script>
</body>
</html>