如何删除字符串中的所有非大写字符?

How to remove all non-uppercase characters in a string?

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

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

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

正则表达式将寻找任何东西 不是 大写字母(?! 否定前瞻)。
如果你想用其他案例测试它,我已经创建了一个 regex101

EDIT 作为此线程的更新,您还可以使用方块内的 ^ 字符来 reverse效果。

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

这将匹配所有非大写的字符,并用任何内容替换它们。

快速简便:

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

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

解释:

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

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

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

它将echo大写字母。

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

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

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

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

multibyte/unicode 等效项为:(Demo)

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

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