【问题标题】:Best practice in filtering non-printable characters过滤不可打印字符的最佳实践
【发布时间】:2013-02-22 10:25:36
【问题描述】:

在构建票务系统前端时,我偶然发现了我们的 QA 团队发现的一个问题。

问题是我们没有过滤任何不可打印的字符,这可能会导致奇怪的问题:

  • 复制粘贴示例代码不起作用
  • 客户滥用表单粘贴多个不可打印字符,实际上没有任何意义

如果我们要求客户输入任何不可打印的字符,我们可以要求他上传一个文本文件到工单。

那么,在删除非打印文件时应该考虑什么?

我要提前感谢所有参与此讨论的参与者!

【问题讨论】:

    标签: non-printing-characters


    【解决方案1】:

    显然基于此资源有 2 组 UTF-8 不可打印控制字符:

    http://www.utf8-chartable.de/

    考虑到这一点,函数中的数组将如下所示:

    array(
        '/\x00/', '/\x01/', '/\x02/', '/\x03/', '/\x04/',
        '/\x05/', '/\x06/', '/\x07/', '/\x08/', '/\x09/',
        '/\x0A/', '/\x0B/', '/\x0C/', '/\x0D/', '/\x0E/', '/\x0F/', '/\x10/',
        '/\x11/', '/\x12/', '/\x13/', '/\x14/', '/\x15/', '/\x16/', '/\x17/',
        '/\x18/', '/\x19/', '/\x1A/', '/\x1B/', '/\x1C/', '/\x1D/', '/\x1E/',
        '/\x1F/', '/\x7F/', '/\xC2 \x80/', '/\xC2 \x81/', '/\xC2 \x82/',
        '/\xC2 \x83/', '/\xC2 \x84/', '/\xC2 \x85/', '/\xC2 \x86/', '/\xC2 \x87/',
        '/\xC2 \x88/', '/\xC2 \x89/', '/\xC2 \x8A/', '/\xC2 \x8B/', '/\xC2 \x8C/',
        '/\xC2 \x8D/', '/\xC2 \x8E/', '/\xC2 \x8F/', '/\xC2 \x90/', '/\xC2 \x91/',
        '/\xC2 \x92/', '/\xC2 \x93/', '/\xC2 \x94/', '/\xC2 \x95/', '/\xC2 \x96/',
        '/\xC2 \x97/', '/\xC2 \x98/', '/\xC2 \x99/', '/\xC2 \x9A/', '/\xC2 \x9B/',
        '/\xC2 \x9C/', '/\xC2 \x9D/', '/\xC2 \x9E/', '/\xC2 \x8F/'
    );
    

    【讨论】:

      【解决方案2】:

      我们目前正在使用以下 PHP 方法:

      function filterNonPrintableCharacters($text)
      {
          $text = preg_replace(
              array(
                  '/\x00/', '/\x01/', '/\x02/', '/\x03/', '/\x04/',
                  '/\x05/', '/\x06/', '/\x07/', '/\x08/', '/\x09/',
                  '/\x0B/','/\x0C/','/\x0D/', '/\x0E/', '/\x0F/', '/\x10/', '/\x11/',
                  '/\x12/','/\x13/','/\x14/','/\x15/', '/\x16/', '/\x17/', '/\x18/',
                  '/\x19/','/\x1A/','/\x1B/','/\x1C/','/\x1D/', '/\x1E/', '/\x1F/'
              ),
              '',
              $text
          );
      
          return $text;
      }
      

      我可能遗漏了一些东西,所以我会感谢任何 cmets。

      【讨论】:

        猜你喜欢
        • 2014-05-23
        • 2015-11-16
        • 2013-02-04
        • 1970-01-01
        • 1970-01-01
        • 2019-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多