2012-08-23 75 views
1

多种格式我有一个设置使用的preg_match以验证电话号码字段:验证用的preg_match

function ValidPhone($phone) { 
    return preg_match('/^[0-9]{3}-[0-9]{3}-[0-9]{4}$/', trim($phone)); 
} 

这保证了电话号码的XXX-XXX-XXXX格式的形式进入它是数字。

我对regexp不是很熟悉;谁能告诉我如何扩大这个允许多种格式?即xxx xxx xxxx或xxx.xxx.xxxx或(xxx)xxx-xxxx

谢谢。

+0

如果使用正则表达式匹配,你需要知道你需要支持什么格式。我认为Sean下面会提出一个更好的选择。一个匹配多个或两个格式的正则表达式会非常复杂。 – Andrew

+0

不幸的是,我们确实需要匹配确切的格式,我在OP中提到的格式。 – EmmyS

回答

5

我认为最简单的解决办法是刚去掉一切不是数字第一:

function ValidatePhone($phone) { 
    $phone = preg_replace('/\D+/', '', $phone); 
    return strlen($phone) == 10; 
} 

既然你要验证的格式,而不是内容,这应该这样做:

function ValidatePhone($phone) { 
    $patterns = array(
     '\d{3}([-\. ])\d{3}\g{-1}\d{4}', 
     '\(\d{3}\) \d{3}-\d{4}' 
     ); 

    $phone = trim($phone); 

    foreach ($patterns as $pattern) { 
     if (preg_match('/^' . $pattern . '$/', $phone)) 
      return true; 
    } 

    return false;                             
} 
+0

不幸的是,这不是我们所需要的。我们需要验证非常具体的格式,即我在OP中提到的格式。 – EmmyS

+0

已更新。另外,如果这是为了在用户界面中验证用户提供的数据,请为用户提供一个帮助,并且更加宽容您接受的内容。理想情况下,您只能存储电话号码的10位数字(假设为NPA编号),然后将其格式化,然后在返回到用户界面的过程中进行格式化。 –

+0

谢谢。我会试试看。它部分用于用户提供的数据,但是使用相同的脚本来验证我们从外部服务收到的数据,因此验证必须在我们收到数据时完成,而不是在输入数据时完成。 – EmmyS

0

对于美国的电话号码:

\(?[2-9]\d\d)?[ -\.]?[2-9]\d\d[ -\.]?\d{4} 
0
(\d{3} \d{3} \w{4})|(\d{3}-\d{3}\-\d{4})|(\d{3}\.\d{3}\.\d{4}) 

\d:一位数[0-9]

\d{3}:三一位数

|:逻辑或