【问题标题】:Whitelist in phpphp中的白名单
【发布时间】:2010-11-18 08:02:41
【问题描述】:

我为用户输入了他们应该输入电话号码的地方。问题是有些人用连字符和空格写他们的电话号码。我想通过过滤器输入输入以删除此类内容并仅在我的数据库中存储数字。

我想我可以为空格和特殊字符做一些 str_replace() 。 但是我认为更好的方法是只挑选数字而不是删除其他所有内容。我想我听说过“白名单”这个词。

能否请您指出用 PHP 解决这个问题的方向?

示例:我希望输入“0333 452-123-4”得到“03334521234”

谢谢!

【问题讨论】:

    标签: php user-input whitelist


    【解决方案1】:

    在客户端,我确实建议使用您在创建表单时设计的一些格式。这适用于邮编或电话领域。看看这个 jquery plugin 以供参考。稍后在服务器端会容易得多。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:
        $number = filter_var(str_replace(array("+","-"), '', $number), FILTER_SANITIZE_NUMBER_INT);
        

        Filter_Var 删除除优点和缺点之外的所有内容,而 str_replace 删除了这些。

        或者你可以使用 preg_replace

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

        【讨论】:

          【解决方案4】:

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

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

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

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

          顺便说一句,根据定义,仅选择数字与删除其他所有内容相同。如果您的意思不同,您可能需要重新表述。

          【讨论】:

          • 您的示例代码运行良好,但我很难理解它。我写道: $phone = preg_replace('/[^\d]/', '', $phone);反而。这两者有区别吗?我在哪里可以了解更多关于您使用的感叹号的信息?
          • 唯一的区别是我用空字符串替换一组非数字(因此 + 运算符表示一个或多个),而不是用空字符串替换单个非数字。真的很细微的差别。
          猜你喜欢
          • 2017-04-19
          • 1970-01-01
          • 2016-09-09
          • 2012-04-22
          • 2016-10-31
          • 1970-01-01
          • 1970-01-01
          • 2016-03-31
          • 1970-01-01
          相关资源
          最近更新 更多