【问题标题】:Validating UK phone numbers in PHP在 PHP 中验证英国电话号码
【发布时间】:2011-12-27 07:16:51
【问题描述】:

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

现在它验证时没有空格,并且至少有 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 />";
}

【问题讨论】:

  • 如果您可以为英国手机输入“模板”会很有帮助:)
  • 好的,你想要多强的验证?还有英国电话号码的长度是多少
  • 这取决于您希望接受的格式,因为许多人输入的电话号码不同,例如 +44(0)1234567890、01234567890、01234 567890、0208 1234 567、020 1234 5678 等。你能可以告诉我们您愿意接受哪种格式,或者您是否愿意接受所有“常规”格式?
  • 您好!对不起,在网站上工作了一夜。我不太在意不同的方式,所有方式都很好。我不擅长 PHP,所以任何帮助将不胜感激。

标签: php format phone-number


【解决方案1】:

电话号码对于正则表达式模式来说通常很糟糕,这正是您所需要的。

以这种模式为例:

$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

【讨论】:

  • 优秀 - 我将 PHP 更改为 preg_match 并使用您的模式来验证英国格式的混合。它也帮助我理解了模式,所以谢谢。
  • 这对于非手机号码不是返回无效(07)吗?
  • @horse 是的,它只验证英国手机号码,但很容易适应验证固定电话号码。
  • @DavidBarker 你能给我一个关于如何编辑固定电话验证的指针吗?谢谢
【解决方案2】:

所以你只想允许空格?

那么你可以在开头使用str_replace() 忽略空格:

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

【讨论】:

  • 这似乎不起作用,但我除了我对 PHP 一无所知 - 也许你可以用可以验证所有输入电话号码方式的代码替换我上面的代码?
【解决方案3】:

您使用的The is_numeric function 甚至不是美国电话号码的合适选择。例如,它接受像 0xABCDEF 这样的十六进制数字,它应该拒绝。

对于像这样的简单文本匹配,正则表达式通常是最简单的解决方案。正则表达式指定文本的模式。 PHP 具有让您在文本中搜索或替换正则表达式匹配项的功能。

如果您将电话号码定义为至少包含 7 个字符且仅包含数字和空格的字符串,则相应的正则表达式将为 /^[0-9 ]{7,}$/。括号内的文本表示一组字符,{7,} 表示我们正在连续查找这些字符中的至少 7 个,^$ 表示我们的匹配应该从头开始字符串并在字符串的末尾结束。 PHP 文档has a section explaining regular expressions in greater detail.

您可以使用the preg_match function 来 确保电话号码匹配:

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

【讨论】:

  • 杰里米,为什么不preg_match('/^[0-9 ]+$/', $phone)?只是想知道,因为我对正则表达式不是很有经验。
  • 这将如何写在完整的声明中?我是否更改了 if(!$phone || strlen($phone)
  • @BlandyDoes:这个表达式将执行验证的两个步骤,检查长度和检查内容。使用它的最简单方法就是替换 if(!$phone || strlen($phone) &lt; 8) { 行,尽管我看到你已经有了一个可行的解决方案。 :-)
【解决方案4】:

这匹配所有带有各种标点符号的英国格式:

  ^\(?(?:(?: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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      我根据 [此处][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>

      【讨论】:

      • 这不允许空格,这是在原始问题中要求的。
      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 2010-09-15
      • 2012-01-14
      • 2011-03-22
      相关资源
      最近更新 更多