2009-08-10 62 views
0

我有一个用户的输入,他们应该输入他们的电话号码。问题在于有些人在他们的电话号码中写有连字符和空格。我想通过一个过滤器来删除这些东西,并只在我的数据库中存储数字。在php中的白名单

我想我可以为空格和特殊字符做一些str_replace()。 但是我认为更好的方法是挑出数字而不是删除其他所有数字。我想我已经听到了关于这个问题的“白名单”一词。

请你指点我在PHP中解决这个问题的方向吗?

:我想输入 “0333 452-123-4” 导致 “03334521234”

谢谢!

回答

4

这是一个不平凡的问题,因为有许多俗语和区域差异。请参阅What is the best way for converting phone numbers into international format (E.164) using Java?这是Java,但适用相同的规则。

我会说,除非你需要更全面的功能,保持简单。创建一个有效的正则表达式列表,并检查每个输入,直到找到匹配。

如果你想它真的简单,只需删除非数字字符:

$phone = preg_replace('![^\d]+!', '', $phone); 

顺便说一句,只是挑选出来的数字是,根据定义,等同于移除一切。如果你的意思是不同的话,你可能会想要重述一下。

+0

很好解释。 +1 – Boldewyn 2009-08-10 15:23:56

+0

您的示例代码确实工作得很好,但我真的很难理解它。我写道: $ phone = preg_replace('/ [^ \ d] /','',$ phone);改为 。这两者有什么不同?我在哪里可以阅读更多关于您使用的感叹号? – 2009-08-10 20:38:41

+0

唯一的区别是我用一个空字符串(因此+运算符表示一个或多个)替换一组非数字,而不是一个空字符串的非数字。真的非常小的差异。 – cletus 2009-08-10 23:14:35

1
$number = filter_var(str_replace(array("+","-"), '', $number), FILTER_SANITIZE_NUMBER_INT); 

Filter_Var去除一切,但长处和短处,并str_replace函数摆脱那些。

或者你可以使用的preg_replace

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

你可以做到这一点的两种方式。遍历字符串中的每个索引,并在其上运行is_numeric(),或者可以在字符串上使用正则表达式。

0

在客户端,我建议使用您在创建表单时设计的一些格式。这对于邮政或电话领域非常有用。看看这个jquery plugin作为参考。稍后在服务器端很容易。