我需要将总是小写的名称变成大写。
e.g。 john johnsson
- > John Johnsson
但也是:
jonny-bart johnsson
- > Jonny-Bart Johnsson
如何使用PHP实现此目的?
答案 0 :(得分:6)
您还可以使用正则表达式:
preg_replace_callback('/\b\p{Ll}/', 'callback', $str)
\b
表示单词边界,\p{Ll}
表示Unicode中的任何小写字母。 preg_replace_callback
会为每个匹配调用一个名为callback
的函数,并将匹配替换为其返回值:
function callback($match) {
return mb_strtoupper($match[0]);
}
此处mb_strtoupper
用于将匹配的小写字母转换为大写。
答案 1 :(得分:3)
如果您期待unicode字符......或者即使您没有,我仍然建议使用mb_convert_case。当有一个php函数时,你不需要使用preg_replace。
答案 2 :(得分:2)
<?php
//FUNCTION
function ucname($string) {
$string =ucwords(strtolower($string));
foreach (array('-', '\'') as $delimiter) {
if (strpos($string, $delimiter)!==false) {
$string =implode($delimiter, array_map('ucfirst', explode($delimiter, $string)));
}
}
return $string;
}
?>
<?php
//TEST
$names =array(
'JEAN-LUC PICARD',
'MILES O\'BRIEN',
'WILLIAM RIKER',
'geordi la forge',
'bEvErly CRuSHeR'
);
foreach ($names as $name) { print ucname("{$name}\n"); }
//PRINTS:
/*
Jean-Luc Picard
Miles O'Brien
William Riker
Geordi La Forge
Beverly Crusher
*/
?>
来自ucwords
的PHP手册条目的评论。
答案 3 :(得分:1)
使用正则表达式:
$out = preg_replace_callback("/[a-z]+/i",'ucfirst_match',$in);
function ucfirst_match($match)
{
return ucfirst(strtolower($match[0]));
}
答案 4 :(得分:0)
这是我提出的(测试过的)......
$chars="'";//characters other than space and dash
//after which letters should be capitalized
function callback($matches){
return $matches[1].strtoupper($matches[2]);
}
$name="john doe";
$name=preg_replace_callback('/(^|[ \-'.$chars.'])([a-z])/',"callback",$name);
或者如果你有php 5.3+这可能更好(未经测试):
function capitalizeName($name,$chars="'"){
return preg_replace_callback('/(^|[ \-'.$chars.'])([a-z])/',
function($matches){
return $matches[1].strtoupper($matches[2]);
},$name);
}
我的解决方案比其他一些发布的解决方案更冗长,但我相信它提供了最大的灵活性(您可以修改$chars
字符串以更改哪些字符可以分隔名称)。