2009-12-20 197 views

回答

15

这是我在网上找到的一个很酷的正则表达式。它以几乎任何美国格式验证一个数字并将其转换为(xxx)xxx-xxxx。我认为这很好,因为那时人们可以使用他们习惯使用的任何格式输入任何10位数字的美国电话号码,并从中得到格式正确的号码。

以下是可以放入MY_form_validation类的全部函数。我希望我的表单允许空字段,所以如果你想强制一个值,你必须改变它。

function valid_phone_number_or_empty($value) 
{ 
    $value = trim($value); 
    if ($value == '') { 
     return TRUE; 
    } 
    else 
    { 
     if (preg_match('/^\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}$/', $value)) 
     { 
      return preg_replace('/^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$/', '($1) $2-$3', $value); 
     } 
     else 
     { 
      return FALSE; 
     } 
    } 
} 
+0

如何将其整合到验证线内?我是CI noob ... – 2009-12-23 03:01:17

+0

在您的库文件夹中创建名为MY_form_validation的文件。确保你在控制器中调用$ this-> load-> library('form_validation')。然后在处理提交的函数中,执行$ this-> form_validation-> set_rules('phone_1','Phone 1','valid_phone_number_or_empty'); phone_1是您的表单字段。 – Dana 2009-12-23 14:50:00

+0

而不是使用trim,你应该从Dan Beam获取第一行代码(但用$ value替换$ _POST),然后按照你想要的方式进行格式化。 – Dennis 2010-01-28 23:42:35

3

最好的办法是根本不验证电话号码,除非你绝对是100%肯定你只处理美国或至少北美的电话号码。只要你允许来自欧洲的电话号码,我不认为有一个涵盖所有可能性的正则表达式。

+0

是的。这与电子邮件地址基本相同,如下所示:http://www.regular-expressions.info/email.html – 2009-12-20 23:09:23

+0

所有电话号码的常见情况是什么?没错,**号**!看到我的帖子下面 – 2009-12-20 23:18:29

+0

@丹:你的帖子高于... – MiseryIndex 2009-12-21 03:09:26

3

带出非数字与此:

$justNumbers = preg_replace('/\D/', $_POST[ 'phone_num' ]); 

,看看是否有足够的字符!

$numRequired = 7; // make your constraints here 
if(strlen($justNumbers) < $numRequired){ /* ... naughty naughty ... */ } 

这是松散的,当然,但会为国际号码的工作以及(所有它真的做的,如果有超过7个数字输入是看到)。

只需根据您的规格更改所需的位数。

+0

关于这一点的事情是,有很多地方使用10位数字的电话号码,有些地方仍然使用7号。这也不会影响使用区号或连字符/空格的括号来区分pre和修复了电话号码。 – DrewRobertson93 2014-08-26 16:56:01

0

丹解释的正则表达式解决方案将是实现它的方法 - 但您可能想重新考虑验证电话号码。如果用户想添加他/她在纸上做的笔记,该怎么办? - 我看到的电话号码字段中输入的是这样的东西很多值:

307-555-2323(家用)

307-555-3232下午6点后

我想今天我们可以假设用户知道要输入什么。

+6

通过验证限制数据输入总是有很好的理由。字段不是用于笔记,它们是用于特定信息。 – 2010-06-03 21:02:41