用PHP验证英国电话号码

时间:2011-11-11 19:52:18

标签: php format phone-number

我购买了一份联系表格。很棒的小东西,但我需要转换电话号码的验证,以允许英国数字格式 - 换句话说,允许空格。

现在它验证没有空格,最小长度为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 />";
}

6 个答案:

答案 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

以及非常好的堆栈溢出帖子:

A comprehensive regex for phone number validation

答案 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位数,具体取决于范围)。

模式列表太长,无法在此处重现,但可在以下位置获取:

http://aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers

答案 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>