将字符串中的所有大写单词转换为标题大小写

问题描述 投票:0回答:3

我正在尝试替换句子中的单词,即

HELLO World WHAT foo

Hello World What foo

到目前为止有办法检测它:

preg_replace('/(\b[A-Z][A-Z]+\b)/sm','$1', $string);

但它没有任何作用,因为我不能将 ucwords('$1') 作为参数。

附注 这种方法不好: ucwords(strtolower($string));因为我想保留所有不全大写的内容。

php regex preg-replace cpu-word title-case
3个回答
2
投票

使用匿名函数比调用

/e
修饰符稍微更有效。

   $formatted = preg_replace_callback(
        '/(\b[A-Z][A-Z]+\b)/',
        create_function(
            '$matches',
            'return ucwords(strtolower($matches[0]));'
        ),
        $string
    );

2
投票

使用如何:

ucwords(strtolower($string));

您可以将此方法与

e
修饰符结合使用:

preg_replace('/(\b[A-Z][A-Z]+\b)/sme','ucwords(strtolower($1))', $string);

0
投票

通过调用多字节安全本机函数

mb_convert_case()
并指定标题大小写标志,可以最优雅地实现您想要的结果。 演示

$string = 'HELLO World WHAT';

echo mb_convert_case($string, MB_CASE_TITLE);
// Hello World What

要专门定位全大写单词,请在全大写字母字符类周围使用单词边界,并仅匹配两个或多个字母的单词。 演示

echo preg_replace_callback(
         '/\b[A-Z]{2,}\b/',
         fn($m) => mb_convert_case($m[0], MB_CASE_TITLE),
         $string
     );
© www.soinside.com 2019 - 2024. All rights reserved.