【问题标题】:How to remove all non-uppercase characters in a string?如何删除字符串中的所有非大写字符?
【发布时间】:2017-12-10 12:51:30
【问题描述】:

是的,我基本上只是想将Social Inc.David Jason 之类的短语分解为SIDJ。我试过用explode,但不知道如何爆炸BUT大写字母,我需要使用preg_match()吗?

【问题讨论】:

  • 我推荐使用正则表达式。因为这样你也可以说,他只能在词首使用大写字母
  • 所以你实际上并没有试图explode这里的任何东西,而是压缩/减少一些东西。 preg_replace 用空字符串替换所有大写字母 ([^A-Z]) 将是一种快速的方法。
  • @CBroe 请不要将答案发布为 cmets。

标签: php regex preg-replace uppercase


【解决方案1】:

Nicholas 和 Bernhard 提供了成功的正则表达式模式,但它们没有达到应有的效率。

使用/[^A-Z]+/ 和带有preg_replace() 的空替换字符串。

preg_replace('~[^A-Z]+~', '', $string)

否定字符类有一个或多个量词,因此匹配更长的子字符串并且需要更少的替换。

多字节/unicode 等效项是:(Demo)

preg_replace('~[^\p{Lu}]+~u', '', 'Az+0ǻÉé')  // outputs: AÉ

这也是与 preg_split 一起使用的最佳模式,但 preg_split 会生成一个数组,因此需要调用 implode 的额外步骤。

【讨论】:

    【解决方案2】:

    您可以使用此正则表达式 (?![A-Z]).preg_replace() 来替换除大写字符之外的每个字符。

    preg_replace("/(?![A-Z])./", "", $yourvariable)
    

    正则表达式将查找任何大写字母(?! 负前瞻)。
    如果你想用其他情况测试它,我已经创建了一个regex101

    编辑作为此线程的更新,您还可以使用方括号内的^ 字符来反转效果。

    preg_replace("/([^A-Z])./", "", $yourvariable)
    

    这将匹配所有非大写的字符并将它们替换为空。

    【讨论】:

      【解决方案3】:

      快速简单:

      $ucaseletters = preg_replace('/[^A-Z]/', '', $input);
      

      这将替换 A-Z 范围内非大写字母的所有内容。

      解释:

      ^ within [] (Character-Set) is the negation-Operator (=anything that is NOT...)
      

      【讨论】:

      • 这可能会造成混淆,因为^ 运算符也用于开始一行(例如以^(pre). 开头)
      • /\P{Lu}+/u,如果它是 unicode 输入(无论哪种情况,我也会将+ 用于一个或多个)。
      【解决方案4】:

      我有一个更复杂的解决方案,但它也有效!

      $s = str_split("Social Inc.");
      foreach ($s as $idx => $char) {
          if(preg_match("/[A-Z]/", $char))
          {
              echo $char;
          }
      }
      

      它将echo大写字母。

      【讨论】:

        猜你喜欢
        • 2013-03-12
        • 1970-01-01
        • 2011-10-19
        • 1970-01-01
        • 2010-12-04
        • 1970-01-01
        • 2013-11-12
        • 2013-01-19
        • 2011-03-13
        相关资源
        最近更新 更多