php 像“奥沙利文”这样的名字大写的简单方法?

sf6xfgos  于 2023-08-02  发布在  PHP
关注(0)|答案(3)|浏览(104)

取两个字符串:

"o'sulLivAn"
"doUble-baRrel"

字符串
预期结果:

"O'Sullivan"
"Double-Barrel"


我原以为ucwords(strtolower($str))可以做到这一点,但它将字符串视为单个单词。
我知道我可以explode,或者更确切地说,preg_split字符串,然后将各部分大写,然后重新组合在一起,但我想知道是否有更好的方法?
通常在PHP和类似的东西中,往往会有一个函数隐藏在某个地方,它很有用,但并不明显或众所周知。

rjee0c15

rjee0c151#

你可以在这里使用preg_replace_callback():

function upcaseLetters(string $line): string {
    return preg_replace_callback('#^[\w]|[\W][\w]#', function ($match) {    
        return strtoupper($match[0]);
    }, strtolower($line));
}

字符串
用法示例:

$lines = [
    "o'sulLivAn",
    "doUble-baRrel",
];

foreach ($lines as $line) {
    echo upcaseLetters($line), "\n";
}


演示:https://3v4l.org/l8BKF
输出:

O'Sullivan
Double-Barrel


参考文件:

gfttwv5a

gfttwv5a2#

没有PHP函数可以做到这一点。
这里有一个没有循环的一行程序(有点)

$str1 = "double-barrel";
$str2 = "o'sulLivAn";

function my_ucase( $str, $chars="-'" ) {
    return implode(array_map( 'ucwords', array_map( 'strtolower', preg_split( "~([".$chars."])~", $str, null, PREG_SPLIT_DELIM_CAPTURE ))));
}

echo my_ucase($str1);
echo my_ucase($str2);

字符串

u59ebvdq

u59ebvdq3#

如果你不介意e修饰符(2016年已弃用):

preg_replace('!(^|\W)[a-z]!e', "strtoupper('\\0')", strtolower($text));

字符串

相关问题