【问题标题】:Remove all non-matching characters in PHP string?删除 PHP 字符串中所有不匹配的字符?
【发布时间】:2010-10-03 10:19:21
【问题描述】:

我有一些文本,我想从中删除所有不属于以下内容的字符。

desired_characters =

0123456789!&',-./abcdefghijklmnopqrstuvwxyz\n

最后一个是我想要保留的\n(换行符)。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    要匹配除所列字符之外的所有字符,请使用inverted character set [^…]

    $chars = "0123456789!&',-./abcdefghijklmnopqrstuvwxyz\n";
    $pattern = "/[^".preg_quote($chars, "/")."]/";
    

    这里preg_quote 用于转义某些特殊字符,以便将它们解释为文字字符。

    您还可以使用字符范围来表示列出的字符:

    $pattern = "/[^0-9!&',-.\\/a-z\n]/";
    

    在这种情况下,,-. 中的文字 - 是否被转义并不重要。因为,-. 被解释为从, (0x2C) 到. (0x2E) 之间已经包含- (0x2D) 的字符范围。

    然后你可以删除那些与preg_replace匹配的字符:

    $output = preg_replace($pattern, "", $str);
    

    【讨论】:

      【解决方案2】:
      $string = 'This is anexample $tring! :)';
      $string = preg_replace('/[^0-9!&\',\-.\/a-z\n]/', '', $string);
      
      echo $string; // hisisanexampletring!
      

      ^ 这是区分大小写的,因此从字符串中删除了大写 T。要同时允许大写字母,$string = preg_replace('/[^0-9!&\',\-.\/A-Za-z\n]/', '', $string)

      【讨论】:

      • 字符类中的破折号必须是第一个或最后一个字符,或者被转义。否则它将指示一个范围。
      • @kemp - 不知道为什么我错过了!已编辑,谢谢指出:)
      • @kemp:这不太对。还有其他几种情况不需要转义范围指示符,因为它不是字符范围的一部分:[-](仅-)、[a-b-c]ab-、@ 987654329@)或[\d-.]\d-.)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2015-12-02
      • 1970-01-01
      相关资源
      最近更新 更多