我正在尝试替换句子中的单词,即
HELLO World WHAT foo
至
Hello World What foo
到目前为止有办法检测它:
preg_replace('/(\b[A-Z][A-Z]+\b)/sm','$1', $string);
但它没有任何作用,因为我不能将 ucwords('$1') 作为参数。
附注 这种方法不好: ucwords(strtolower($string));因为我想保留所有不全大写的内容。
使用匿名函数比调用
/e
修饰符稍微更有效。
$formatted = preg_replace_callback(
'/(\b[A-Z][A-Z]+\b)/',
create_function(
'$matches',
'return ucwords(strtolower($matches[0]));'
),
$string
);
使用如何:
ucwords(strtolower($string));
您可以将此方法与
e
修饰符结合使用:
preg_replace('/(\b[A-Z][A-Z]+\b)/sme','ucwords(strtolower($1))', $string);
通过调用多字节安全本机函数
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
);