【问题标题】:Replace all non printable characters except newline characters替换除换行符以外的所有不可打印字符
【发布时间】:2021-08-04 20:02:26
【问题描述】:

我想替换所有不可打印的字符,尤其是文本中的表情符号,但想保留换行符,例如 \n\r

我目前有这个用于转义不可打印的字符,但它也可以转义 \n\r

preg_replace('/[[:^print:]]/', '', $value);

【问题讨论】:

    标签: php regex laravel


    【解决方案1】:

    [:print:] 是用于可打印字符的 POSIX 字符类。如果您在否定字符类中使用它,您可以进一步添加您不想与此模式匹配的字符,即您可以使用

    preg_replace('/[^\r\n[:print:]]/', '', $value)
    

    PHP demo

    $value = "One\tline\r\nThe second line";
    echo preg_replace('/[^\r\n[:print:]]/', '', $value);
    // => Oneline
    //    The second line
    

    [^\r\n[:print:]] 模式匹配除可打印字符之外的所有字符,CR 和 LF 字符。

    【讨论】:

      【解决方案2】:

      我认为这样做可以:

      preg_replace('/(?![\r\n])[[:^print:]]/', '', $value);
      
      • (?![\r\n]) - 确保下一个字符不是\r 也不是\n
      • [[:^print:]] - 捕获不可打印的字符

      实现相同目标的反向逻辑替代解决方案如下:

      preg_replace('/(?=[^\r\n])[[:^print:]]/', '', $value);
      

      【讨论】:

        【解决方案3】:

        正则表达式“匹配某些内容,但不匹配其他内容”的一般想法是首先匹配“其他内容”,然后指示引擎跳过它。

        比如……

        preg_replace('/[\r\n](*SKIP)(*FAIL)|[[:^print:]]/', '', $value);
        

        这匹配换行符,然后丢弃匹配。任何其他不可打印的字符仍然与后半部分匹配,并替换为空字符串。

        【讨论】:

          猜你喜欢
          • 2023-04-09
          • 1970-01-01
          • 1970-01-01
          • 2018-10-21
          • 2012-09-14
          • 2011-08-27
          • 2013-05-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多