如“o'sullivan”这样名称大写的好方法?

时间:2010-09-29 15:40:45

标签: php

取两个字符串:

"o'sulLivAn"
"doUble-baRrel"

期望的结果:

"O'Sullivan"
"Double-Barrel"

我认为ucwords(strtolower($str))可以做到这一点,但它将字符串视为一个单词。

我知道我可以explode,或者更确切地说preg_split字符串然后将部分大写并重新组合在一起,但我想知道是否有更好的方法吗?

通常使用PHP和类似的东西,往往会有一个功能隐藏在某个有用但不明显或众所周知的地方。

3 个答案:

答案 0 :(得分:3)

您可以在此处使用preg_replace_callback:

$lines = array(
    "o'sulLivAn",
    "doUble-baRrel",
);

function upcaseLetters($match){
    return strtoupper($match[0]);
}

foreach($lines as $line){
    echo preg_replace_callback('#^[\w]|[\W][\w]#','upcaseLetters',strtolower($line))."<br/>";
}

输出:

O'Sullivan
Double-Barrel

答案 1 :(得分:1)

没有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);

答案 2 :(得分:1)

如果您不介意e修饰符:

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