取两个字符串:
"o'sulLivAn"
"doUble-baRrel"
期望的结果:
"O'Sullivan"
"Double-Barrel"
我认为ucwords(strtolower($str))
可以做到这一点,但它将字符串视为一个单词。
我知道我可以explode
,或者更确切地说preg_split
字符串然后将部分大写并重新组合在一起,但我想知道是否有更好的方法吗?
通常使用PHP和类似的东西,往往会有一个功能隐藏在某个有用但不明显或众所周知的地方。
答案 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));