我写了正则表达式(结合了差异线程)来验证英国的数字。
根据正则表达式,它应该验证数字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 " ;
}
}
答案 0 :(得分:2)
它将匹配此:
02083) 123456
而不是这个:
0208 123-4567
因为一些原因
\(?02\d{3}\)
更改为\(?02\d{3}\)?
\(?02\d{3}\)?
更改为\(?02\d{2}\)?
\s?\d{3}-\s?\d{3}$
。{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);