用PHP验证英国电话号码

用PHP验证英国电话号码,php,format,phone-number,Php,Format,Phone Number,我买了一张联系表。很棒的小东西,但我需要将电话号码的验证转换为允许英国号码格式——换句话说,允许空格 现在,它不带空格进行验证,最小长度为8个字符: if(is_numeric($phone)) { if(!$phone || strlen($phone) < 8) { $error .= "Please enter your phone number without spaces.<br />"; } } else { $err

我买了一张联系表。很棒的小东西,但我需要将电话号码的验证转换为允许英国号码格式——换句话说,允许空格

现在,它不带空格进行验证,最小长度为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 />";
}
if(是数字($phone))
{
如果(!$phone | | strlen($phone)<8)
{
$error.=“请输入您的电话号码,不带空格。
”; } } 其他的 { $error.=“请在电话号码字段中输入数字字符。
”; }
那么您只想允许使用空格

然后,您可以使用
str_replace()
忽略开头的空格:

$phone = str_replace(' ', '', $phone);

所以你只想允许空间

然后,您可以使用
str_replace()
忽略开头的空格:

$phone = str_replace(' ', '', $phone);
对于美国电话号码来说,你使用的电话号码甚至不是一个合适的选择。例如,它接受像
0xABCDEF
这样的十六进制数字,但应该拒绝

对于这样的简单文本匹配,正则表达式通常是最简单的解决方案。正则表达式指定文本的模式。PHP有一些函数可以让您搜索或替换文本中的正则表达式匹配项

如果将电话号码定义为至少包含7个字符的字符串,其中仅包含数字和空格,则相应的正则表达式将是
/^[0-9]{7,}$/
。括号内的文本表示一组字符,
{7,}
表示我们在一行中查找至少7个字符,
^
$
表示我们的匹配应该从字符串的开头开始,到字符串的结尾结束。PHP文档

你会习惯的 确保电话号码匹配:

if (preg_match('/^[0-9 ]{7,}$/', $phone)) {
对于美国电话号码来说,你使用的电话号码甚至不是一个合适的选择。例如,它接受像
0xABCDEF
这样的十六进制数字,但应该拒绝

对于这样的简单文本匹配,正则表达式通常是最简单的解决方案。正则表达式指定文本的模式。PHP有一些函数可以让您搜索或替换文本中的正则表达式匹配项

如果将电话号码定义为至少包含7个字符的字符串,其中仅包含数字和空格,则相应的正则表达式将是
/^[0-9]{7,}$/
。括号内的文本表示一组字符,
{7,}
表示我们在一行中查找至少7个字符,
^
$
表示我们的匹配应该从字符串的开头开始,到字符串的结尾结束。PHP文档

你会习惯的 确保电话号码匹配:

if (preg_match('/^[0-9 ]{7,}$/', $phone)) {

电话号码对于正则表达式模式来说通常是可怕的,这正是您需要的

例如,此模式:

$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
有很多网站提供教程/备忘单等。对于正则表达式,请尝试以下几种方法:

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


电话号码对于正则表达式模式来说通常是可怕的,这正是您需要的

例如,此模式:

$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
有很多网站提供教程/备忘单等。对于正则表达式,请尝试以下几种方法:

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


这与所有英国格式匹配,有多种标点符号:

  ^\(?(?:(?: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位,取决于范围)

模式列表太长,无法在此处复制,但可从以下网址获得:


这与所有英国格式匹配,有多种标点符号:

  ^\(?(?:(?: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位,取决于范围)

模式列表太长,无法在此处复制,但可从以下网址获得:


您可以将输入解析为整数,然后验证正确的位数

$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)

这将从字符串中删除所有非数字字符和前导零(例如空格、括号、加号、小数等)

*如果(preg_match('/(^\d{12}$)|(^\d{10}$)/',$mobileNumber)==TRUE){*

然后,此正则表达式检查字符串是否包含12位或10位数字,包括447712345678(12位)或7791234567(10位)。它在两个子子句(^\d{12}$)或(^\d{10}$)中匹配,克拉(^)和美元($)表示从一开始(^)到最后($)匹配所有内容\d表示任意数字,下面的{12}表示与前面的语句匹配的次数

这并不意味着数字是有效的,您可以使用像twillio这样的API对numebr进行额外的验证

比如,

$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删除前导零,因此正则表达式检查前导7或447。

您可以将输入解析为整数,然后验证正确的位数

$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($m)