验证英国电话号码,包括其区号

时间:2014-04-21 10:07:50

标签: php regex

我写了正则表达式(结合了差异线程)来验证英国的数字。

根据正则表达式,它应该验证数字0208 123-4567。但事实并非如此。有什么问题?

Example : http://ideone.com/pm1GT2

<?php
$number = '0208 123-4567';
validateUsNumber($number);
function validateUsNumber($number)
{
    $number= preg_replace( '/[^0-9]/', '', $number);
    $pattern = '/^(\+44\s?7\d{3}|\(?07\d{3}\)|\(?02\d{3}\)|\(?01\d{3}\)?)\s?\d{3}\s?\d{3}$/';
    $match = preg_match($pattern,$number);  
    if ($match != false)
    {
    echo " We have a valid UK phone number";
    }
    else
    {
    echo " We have an invalid UK phone number " ;
    }
}

3 个答案:

答案 0 :(得分:2)

它将匹配此:

02083) 123456

而不是这个:

0208 123-4567

因为一些原因

  • 您有第二个括号强制,将\(?02\d{3}\)更改为\(?02\d{3}\)?
  • 您保留{3}并尝试匹配2位数,将\(?02\d{3}\)?更改为\(?02\d{2}\)?
  • 你没有包括 - 臀部任何地方,所以显然它不会匹配。将最后一部分更改为\s?\d{3}-\s?\d{3}$
  • 您的示例在hiphen(-4567)之后有4位数字,因此请将正则表达式的最后一部分更改为量词{4}

因此,您的最终正则表达式应如下所示:

^(\+44\s?7\d{3}|\(?07\d{3}\)|\(?02\d{3}\)?|\(?01\d{3}\)?)\s?\d{3}[-\s]?\d{4}$

这个正则表达式符合你的需要 0208 123-4567

作为建议,从正则表达式检查中删除+ 这里演示:http://regex101.com/r/kM8bC7

答案 1 :(得分:1)

您可以尝试使用此正则表达式:

$pattern = '^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$^';

所以你的代码应该是这样的:

<?php
$number = '0208 123-4567';
$number = '+44 20 8985 5577'; // or this
validateUsNumber($number);
function validateUsNumber($number)
{
    $pattern = '^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{5}\)?[\s-]?\d{4,5}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$^';
    $match = preg_match($pattern,$number);  
    if ($match != false)
    {
    echo " We have a valid UK phone number";
    }
    else
    {
    echo " We have an invalid UK phone number " ;
    }
}

这取自http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers,您可以在那里找到更多针对GB的电话号码验证。我用“1.1匹配任何格式的GB电话号码”。

答案 2 :(得分:1)

您的模式基本上是在寻找一个格式正确的数字,但是它会根据剥离非数字字符的结果进行测试。在此之后,您将永远不会有前导+44,空格或括号:

$number= preg_replace( '/[^0-9]/', '', $number);