使用preg_replace大写第一个单词的字母

时间:2010-08-10 14:50:23

标签: php preg-replace

我需要将总是小写的名称变成大写。

e.g。 john johnsson - > John Johnsson

但也是:

jonny-bart johnsson - > Jonny-Bart Johnsson

如何使用PHP实现此目的?

5 个答案:

答案 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字符串以更改哪些字符可以分隔名称)。