ucwords

(PHP 4, PHP 5, PHP 7, PHP 8)

ucwords将字符串中每个单词的首字母大写

说明

ucwords(string $string, string $separators = " \t\r\n\f\v"): string

返回一个字符串,其中 string 中每个单词的首字母都大写,如果该字符是 ASCII 字符,介于 "a" (0x61) 和 "z" (0x7a) 之间。

对于此函数,单词是指不在 separators 参数中列出的字符组成的字符串。默认情况下,这些字符是:空格、水平制表符、回车符、换行符、换页符和垂直制表符。

要对多字节字符串进行类似的转换,请使用 mb_convert_case() 以及 MB_CASE_TITLE 模式。

参数

string

输入字符串。

separators

可选的 separators 包含单词分隔符字符。

返回值

返回修改后的字符串。

变更日志

版本 说明
8.2.0 大小写转换不再依赖于使用 setlocale() 设置的区域设置。只有 ASCII 字符会被转换。

示例

示例 #1 ucwords() 示例

<?php
$foo
= 'hello world!';
$foo = ucwords($foo); // Hello World!

$bar = 'HELLO WORLD!';
$bar = ucwords($bar); // HELLO WORLD!
$bar = ucwords(strtolower($bar)); // Hello World!
?>

示例 #2 使用自定义分隔符的 ucwords() 示例

<?php
$foo
= 'hello|world!';
$bar = ucwords($foo); // Hello|world!

$baz = ucwords($foo, "|"); // Hello|World!
?>

示例 #3 使用额外分隔符的 ucwords() 示例

<?php
$foo
= "mike o'hara";
$bar = ucwords($foo); // Mike O'hara

$baz = ucwords($foo, " \t\r\n\f\v'"); // Mike O'Hara
?>

注释

注意: 此函数是二进制安全的。

参见

添加注释

用户贡献注释 28 条注释

antoniomax at antoniomax dot com
11 年前
用于格式化 pt-br 中的姓名

<?php

function titleCase($string, $delimiters = array(" ", "-", ".", "'", "O'", "Mc"), $exceptions = array("de", "da", "dos", "das", "do", "I", "II", "III", "IV", "V", "VI"))
{
/*
* 异常情况为小写,表示您不想转换的词语
* 全部大写的异常情况是任何您不想转换为标题大小写
* 但应转换为大写,例如:
* king henry viii 或 king henry Viii 应为 King Henry VIII
*/
$string = mb_convert_case($string, MB_CASE_TITLE, "UTF-8");
foreach (
$delimiters as $dlnr => $delimiter) {
$words = explode($delimiter, $string);
$newwords = array();
foreach (
$words as $wordnr => $word) {
if (
in_array(mb_strtoupper($word, "UTF-8"), $exceptions)) {
// 检查异常列表中是否有应为大写的词语
$word = mb_strtoupper($word, "UTF-8");
} elseif (
in_array(mb_strtolower($word, "UTF-8"), $exceptions)) {
// 检查异常列表中是否有应为大写的词语
$word = mb_strtolower($word, "UTF-8");
} elseif (!
in_array($word, $exceptions)) {
// 转换为大写(仅限非 utf8)
$word = ucfirst($word);
}
array_push($newwords, $word);
}
$string = join($delimiter, $newwords);
}
//foreach
return $string;
}

?>

用法

<?php
$s
= 'SÃO JOÃO DOS SANTOS';
$v = titleCase($s); // 'São João dos Santos'
?>
jmarois at ca dot ibm dot com
14 年前
我的快速且简陋的 ucname(大写名称)函数。

<?php
//函数

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
//测试

$names =array(
'JEAN-LUC PICARD',
'MILES O\'BRIEN',
'WILLIAM RIKER',
'geordi la forge',
'bEvErly CRuSHeR'
);
foreach (
$names as $name) { print ucname("{$name}\n"); }

//打印:
/*
Jean-Luc Picard
Miles O'Brien
William Riker
Geordi La Forge
Beverly Crusher
*/
?>

如果您想处理更多字符,可以在 for-each 循环数组中添加更多分隔符。
NOSPAM dot php at my dot jrklein dot com
4 年前
基于“匿名”于 2005-12-14 发布的代码示例。/e 修饰符不再受 preg_replace() 支持。已重写为使用 preg_replace_callback()。已使用 PHP 7.3 测试。

下面的函数将标准化人员姓名、地址以及报告和论文标题的大小写。调整 "$all_uppercase" 和 "$all_lowercase" 中的列表以适合您正在处理的数据。

function ucwords_title($string, $is_name = false) {
// 标准大小写转换的例外
if ($is_name) {
$all_uppercase = '';
$all_lowercase = 'De La|De Las|Der|Van De|Van Der|Vit De|Von|Or|And';
} else {
// 地址、论文标题... 以及其他任何内容
$all_uppercase = 'Us|Ca|Mx|Po|Rr|Se|Sw|Ne|Nw';
$all_lowercase = 'A|And|As|By|In|Of|Or|To';
}
$prefixes = 'Mac|Mc';
$suffixes = "'S";

// 修剪空格并转换为小写
$str = strtolower(trim($string));

// 将所有首字母大写
$str = preg_replace_callback('/\\b(\\w)/', function ($m) {
return strtoupper($m[1]);
}, $str);

if ($all_uppercase) {
// 将首字母缩略词和大写字母(例如 PHP)大写
$str = preg_replace_callback('/\\b(' . $all_uppercase . ')\\b/', function ($m) {
return strtoupper($m[1]);
}, $str);
}
if ($all_lowercase) {
// 将短语(例如 and)小写
if ($is_name) {
// 所有出现的情况都将更改为小写
$str = preg_replace_callback('/\\b(' . $all_lowercase . ')\\b/', function ($m) {
return strtolower($m[1]);
}, $str);
} else {
// 第一个和最后一个词语不会更改为小写(即标题)
$str = preg_replace_callback('/(?<=\\W)(' . $all_lowercase . ')(?=\\W)/', function ($m) {
return strtolower($m[1]);
}, $str);
}
}
if ($prefixes) {
// 将某些姓名前缀(例如 'Mc')后面的字母大写
$str = preg_replace_callback('/\\b(' . $prefixes . ')(\\w)/', function ($m) {
return $m[1] . strtoupper($m[2]);
}, $str);
}
if ($suffixes) {
// 将某些词语后缀(例如 's)小写
$str = preg_replace_callback('/(\\w)(' . $suffixes . ')\\b/', function ($m) {
return $m[1] . strtolower($m[2]);
}, $str);
}

return $str;
}

// 姓名示例
print ucwords_title("MARIE-LOU VAN DER PLANCK-ST.JOHN", true);
// 输出:Marie-Lou van der Planc-St.John

// 标题示例
print ucwords_title("to be or not to be");
// 输出:"To Be or Not to Be"
robert at broofa dot com
15 年前
一些在下划线和驼峰式命名之间切换的秘诀

<?php
// 下划线转换为大驼峰式
// 例如:"this_method_name" -> "ThisMethodName"
preg_replace('/(?:^|_)(.?)/e',"strtoupper('$1')",$string);

// 下划线转换为小驼峰式
// 例如:"this_method_name" -> "thisMethodName"
preg_replace('/_(.?)/e',"strtoupper('$1')",$string);

// 驼峰式(小写或大写)转换为下划线
// 例如:"thisMethodName" -> "this_method_name"
// 例如:"ThisMethodName" -> "this_method_name"
strtolower(preg_replace('/([^A-Z])([A-Z])/', "$1_$2", $string));
?>

当然,这些并非完全对称。例如...
* this_is_a_string -> ThisIsAString -> this_is_astring
* GetURLForString -> get_urlfor_string -> GetUrlforString
almino dot melo at gmail dot com
8 年前
巴西人名使用的 ucwords。
为巴西人名定制的 ucwords。

<?php
/**
* 用于巴西人名的 ucwords 函数
* 来自 https://php.net/manual/pt_BR/function.ucwords.php#112795 的修改
* @param string $str
* @param array $delimiters
* @param array $exceptions 不需要转换的词语
* @return string
*/
function name($str, $delimiters = array(
" ",
"-",
".",
"'",
"O'",
"Mc",
),
$exceptions = array(
"de",
"do",
"da",
"dos",
"das",
)) {
$result = '';

foreach (
$delimiters as $delimiter) {
# 如果字符串包含分隔符
if (strstr($str, $delimiter)) {

$ucfirst = array();
# 对每个单词应用 ucfirst
foreach (explode($delimiter, mb_strtolower($str)) as $word) {
$word = mb_convert_case($word, MB_CASE_TITLE);

# 处理异常情况
if (in_array(mb_strtoupper($word), $exceptions)) {
$word = mb_strtoupper($word);
} elseif (
in_array(mb_strtolower($word), $exceptions)) {
$word = mb_strtolower($word);
} elseif (
preg_match('/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/', mb_strtoupper($word))) {
# 是罗马数字吗? # http://stackoverflow.com/a/267405/437459
$word = mb_strtoupper($word);
}

$ucfirst[] = $word;
}

# 字符串的首字母大写
$result = implode($delimiter, $ucfirst);
}
}

return
$result;
}
?>
lev at phpfox dot com
18 年前
在 ieure 在 php dot net 上于 2005 年 12 月 4 日 11:57 发布的 ucsmart() 函数中,我发现这个函数与他在 igua 的函数中发现的问题类似。

<?php
function ucsmart($text)
{
return
preg_replace('/([^a-z]|^)([a-z])/e', '"$1".strtoupper("$2")',
strtolower($text));
}
?>

"igua 的代码在我这里为第一个单引号添加了一个反斜杠。除了改变大小写之外,这不会以任何方式改变内容。"

实际上,它最终改变了我的内容(php 5.0.4),因为这个函数转义了单词中间的单引号(撇号)。

例如

who's online?

变成

Who\'s Online?

然而,修复很简单,只需微调正则表达式即可

<?php
function ucsmart($text)
{
return
preg_replace('/([^a-z\']|^)([a-z])/e', '"$1".strtoupper("$2")',
strtolower($text));
}
?>

(注意:在我添加这个笔记之前预览时,我注意到 php 的网站没有正确显示我所做的更改。在表达式中的第一个 a-z 之后,应该转义单引号... 如果没有,你将收到解析错误!并且如果我的文本在这里被着色为 php 代码,请道歉;不是我的错!)

这不会转义出现在单词中间的单引号... 不过,你可能会发现如果你的单词中使用其他特殊字符,并且得到奇怪的输出,你可能需要在正则表达式中添加其他字符。

这是一个很棒的表达式!简单但功能强大。赞赏!
kendsnyder at gmail dot com
17 年前
以下是一个将姓氏首字母大写的函数,考虑了连字符、撇号、"Mc" 和 "Mac"

<?php
function CapitalizeLastName($name) {
$name = strtolower($name);
$name = join("'", array_map('ucwords', explode("'", $name)));
$name = join("-", array_map('ucwords', explode("-", $name)));
$name = join("Mac", array_map('ucwords', explode("Mac", $name)));
$name = join("Mc", array_map('ucwords', explode("Mc", $name)));
return
$name;
}
?>

我用使用 preg_replace() 带 "e" 修饰符、preg_replace_callback() 和逐字符解析的函数对其进行了速度测试。出乎意料的是,这个使用 join()、array_map() 和 explode() 的函数速度最快。
blake at goinoutwest dot com
16 年前
关于 Anonymous 发布的 mb_ucwords() 函数。为了使它真正支持多字节,你还需要使用 mb_substr() 和 mb_strlen() 而不是 substr 和 strlen。

这里对其进行了修正,并进一步扩展,允许使用多个单词分隔符和一个异常列表来修正标题大小写后的结果。这有点繁琐且不优雅,但处理人类语言时往往如此。

function mb_ucwords($str) {
$exceptions = array();
$exceptions['Hp'] = 'HP';
$exceptions['Ibm'] = 'IBM';
$exceptions['Gb'] = 'GB';
$exceptions['Mb'] = 'MB';
$exceptions['Cd'] = 'CD';
$exceptions['Dvd'] = 'DVD';
$exceptions['Usb'] = 'USB';
$exceptions['Mm'] = 'mm';
$exceptions['Cm'] = 'cm';
// 等等

$separator = array(" ","-","+");

$str = mb_strtolower(trim($str));
foreach($separator as $s){
$word = explode($s, $str);

$return = "";
foreach ($word as $val){
$return .= $s . mb_strtoupper($val{0}) . mb_substr($val,1,mb_strlen($val)-1);
}
$str = mb_substr($return, 1);
}

foreach($exceptions as $find=>$replace){
if (mb_strpos($return, $find) !== false){
$return = str_replace($find, $replace, $return);
}
}
return mb_substr($return, 1);
}
ahmet363 at gmail dot com
12 年前
使用 ucwords 函数处理土耳其字符...

<?php
function ucwords_tr($gelen){

$sonuc='';

$kelimeler=explode(" ", $gelen);

foreach (
$kelimeler as $kelime_duz){

$kelime_uzunluk=strlen($kelime_duz);
$ilk_karakter=mb_substr($kelime_duz,0,1,'UTF-8');

if(
$ilk_karakter=='Ç' or $ilk_karakter=='ç'){

$ilk_karakter='Ç';

}elseif (
$ilk_karakter=='Ğ' or $ilk_karakter=='ğ') {

$ilk_karakter='Ğ';

}elseif(
$ilk_karakter=='I' or $ilk_karakter=='ı'){

$ilk_karakter='I';

}elseif (
$ilk_karakter=='İ' or $ilk_karakter=='i'){

$ilk_karakter='İ';

}elseif (
$ilk_karakter=='Ö' or $ilk_karakter=='ö'){

$ilk_karakter='Ö';

}elseif (
$ilk_karakter=='Ş' or $ilk_karakter=='ş'){

$ilk_karakter='Ş';

}elseif (
$ilk_karakter=='Ü' or $ilk_karakter=='ü'){

$ilk_karakter='Ü';

}else{

$ilk_karakter=strtoupper($ilk_karakter);

}

$digerleri=mb_substr($kelime_duz,1,$kelime_uzunluk,'UTF-8');
$sonuc.=$ilk_karakter.kucuk_yap($digerleri).' ';

}

$son=trim(str_replace(' ', ' ', $sonuc));
return
$son;

}

function
kucuk_yap($gelen){

$gelen=str_replace('Ç', 'ç', $gelen);
$gelen=str_replace('Ğ', 'ğ', $gelen);
$gelen=str_replace('I', 'ı', $gelen);
$gelen=str_replace('İ', 'i', $gelen);
$gelen=str_replace('Ö', 'ö', $gelen);
$gelen=str_replace('Ş', 'ş', $gelen);
$gelen=str_replace('Ü', 'ü', $gelen);
$gelen=strtolower($gelen);

return
$gelen;
}

echo
ucwords_tr('ŞEKardi ŞEMŞİYE ĞELENÖ ÖMER'); // Şekardi Şemşiye Ğelenö Ömer
echo ucwords_tr('şEKER iMSAK şÖLEN'); // Şeker İmsak Şölen
hrvoj3e at gmail dot com
11 年前
即使包含连字符,对我也有效的 UTF-8 标题大小写!

$str = 'ĐaaČaa-AAAaaa, BBbb';

$str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8");

echo($str): 'Đaačaa-Aaaaaa, Bbbb'
Luca Borrione luca -a email -d c_o_m
11 年前
特性
- 支持多字节
- 支持多个分隔符

<?php
function ucwords_specific ($string, $delimiters = '', $encoding = NULL)
{
if (
$encoding === NULL) { $encoding = mb_internal_encoding();}

if (
is_string($delimiters))
{
$delimiters = str_split( str_replace(' ', '', $delimiters));
}

$delimiters_pattern1 = array();
$delimiters_replace1 = array();
$delimiters_pattern2 = array();
$delimiters_replace2 = array();
foreach (
$delimiters as $delimiter)
{
$uniqid = uniqid();
$delimiters_pattern1[] = '/'. preg_quote($delimiter) .'/';
$delimiters_replace1[] = $delimiter.$uniqid.' ';
$delimiters_pattern2[] = '/'. preg_quote($delimiter.$uniqid.' ') .'/';
$delimiters_replace2[] = $delimiter;
}

// $return_string = mb_strtolower($string, $encoding);
$return_string = $string;
$return_string = preg_replace($delimiters_pattern1, $delimiters_replace1, $return_string);

$words = explode(' ', $return_string);

foreach (
$words as $index => $word)
{
$words[$index] = mb_strtoupper(mb_substr($word, 0, 1, $encoding), $encoding).mb_substr($word, 1, mb_strlen($word, $encoding), $encoding);
}

$return_string = implode(' ', $words);

$return_string = preg_replace($delimiters_pattern2, $delimiters_replace2, $return_string);

return
$return_string;
}
?>

参数
1. string: 要转换的字符串
2. delimiters: 包含所有想要的分隔符的字符串,例如 "-'"
3. encoding: 字符编码。如果省略,将使用内部字符编码值。

示例用法
<?php
mb_internal_encoding
('UTF-8');
$string = "JEAN-PAUL d'artagnan şŠ-òÀ-éÌ hello - world";
echo
ucwords_specific( mb_strtolower($string, 'UTF-8'), "-'");
?>

输出
Jean-Paul D'Artagnan Şš-Òà-Éì Hello - World
strazds at gmail dot com
15 年前
用于 UTF-8 字符串的 ucwords

<?php
function mb_ucwords($str) {
$str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8");
return (
$str);
}
?>
Q1712 at online dot ms
17 年前
ucwords() 只接受单词前面的空格,尽管某些字符(如“ ”或“(”)通常在单词之间没有空格
<?php
$title
= 'ELVIS "THE KING" PRESLEY - (LET ME BE YOUR) TEDDY BEAR';
echo
ucwords(strtolower($title));
?>
输出:Elvis "the King" Presley - (let Me Be Your) Teddy Bear

为了避免这种情况,我使用一个小函数在这些字符后面添加和删除空格,并在两者之间使用 ucwords()

<?php
function my_ucwords($string)
{
$noletters='"([/'; //如果需要,可以添加更多
for($i=0; $i<strlen($noletters); $i++)
$string = str_replace($noletters[$i], $noletters[$i].' ', $string);
$string=ucwords($string);
for(
$i=0; $i<strlen($noletters); $i++)
$string = str_replace($noletters[$i].' ', $noletters[$i], $string);
return
$string;
}

$title = 'ELVIS "THE KING" PRESLEY - (LET ME BE YOUR) TEDDY BEAR';
echo
my_ucwords(strtolower($title));
?>

输出:Elvis "The King" Presley - (Let Me Be Your) Teddy Bear
匿名
22 年前
这似乎是人们想要的

function uc_all($string) {
$temp = preg_split('/(\W)/', $string, -1, PREG_SPLIT_DELIM_CAPTURE );
foreach ($temp as $key=>$word) {
$temp[$key] = ucfirst(strtolower($word));
}
return join ('', $temp);
}

[编辑说明:已将代码修正为正确]
匿名
18 年前
"ieure at php dot net",你的想法简直是诗歌!

下面的函数将规范化人名和报告、论文标题的大小写。您可能需要根据您正在处理的数据调整“$all_uppercase”和“$all_lowercase”中的列表。

function my_ucwords($str, $is_name=false) {
// 标准大小写转换的例外情况
if ($is_name) {
$all_uppercase = '';
$all_lowercase = 'De La|De Las|Der|Van De|Van Der|Vit De|Von|Or|And';
} else {
// 地址、论文标题......以及其他任何内容
$all_uppercase = 'Po|Rr|Se|Sw|Ne|Nw';
$all_lowercase = 'A|And|As|By|In|Of|Or|To';
}
$prefixes = 'Mc';
$suffixes = "'S";

// 将所有首字母大写
$str = preg_replace('/\\b(\\w)/e', 'strtoupper("$1")', strtolower(trim($str)));

if ($all_uppercase) {
// 将缩略词和首字母缩略词(如 PHP)大写
$str = preg_replace("/\\b($all_uppercase)\\b/e", 'strtoupper("$1")', $str);
}
if ($all_lowercase) {
// 将短语(如 and)小写
if ($is_name) {
// 所有出现都会被更改为小写
$str = preg_replace("/\\b($all_lowercase)\\b/e", 'strtolower("$1")', $str);
} else {
// 首尾单词不会更改为小写(即标题)
$str = preg_replace("/(?<=\\W)($all_lowercase)(?=\\W)/e", 'strtolower("$1")', $str);
}
}
if ($prefixes) {
// 将某些姓名前缀(如 'Mc')后的字母大写
$str = preg_replace("/\\b($prefixes)(\\w)/e", '"$1".strtoupper("$2")', $str);
}
if ($suffixes) {
// 将某些词语后缀(如 's)小写
$str = preg_replace("/(\\w)($suffixes)\\b/e", '"$1".strtolower("$2")', $str);
}
return $str;
}

// 姓名示例
print my_ucwords("MARIE-LOU VAN DER PLANCK-ST.JOHN", true);
// 输出:Marie-Lou van der Planc-St.John

// 标题示例
print my_ucwords("to be or not to be");
// 输出:"To Be or Not to Be"
barnaby ritchley at exeye dot co dot uk
17 年前
一个非常简单的将文本转换为标题大小写的方法

function titleCase($string)
{
return ucwords(strtolower($string));
}

$myString = "SOME TEXT";

echo titleCase($myString);

//将输出 "My Text"
ganzales at inbox dot ru
4 年前
<?php
function mb_ucwords($string, $delimiter = ' (-"[') {
$result = $upper = '';
for (
$i = 0; $i < mb_strlen($string); $i++) {
$letter = mb_substr($string, $i, 1);
$result .= $upper || $i == 0 ? mb_convert_case($letter, MB_CASE_TITLE) : $letter;
$upper = ($i + 1) < mb_strlen($string) && mb_strpos($delimiter, $letter) !== false ? 1 : 0;
}
return
$result;
}
?>
Alex Milkovskyi
9 年前
将字符串转换为驼峰式大小写,这对类名模式很有用
<?php
/**
* 将字符串转换为驼峰式大小写,这对类名模式很有用。
*
* @param $string
* 目标字符串。
*
* @return string
* 驼峰式大小写字符串。
*/
function toCamelCase($string){
$string = str_replace('-', ' ', $string);
$string = str_replace('_', ' ', $string);
$string = ucwords(strtolower($string));
$string = str_replace(' ', '', $string);
return
$string;
}
?>

示例
toCamelCase(make_mE camel-case pLEase) 将返回
MakeMeCamelCasePlease
Alex
15 年前
gregomm 修改的 sentenceNormalizer

特性
1- 删除重复的问号、感叹号和句号
2- 将句子的首字母大写。
3- 不仅使用“.”,还使用“?”和“!”来分割句子
4- 在每个句子的末尾添加一个空格
5- 保留换行符

--从原始函数中移除--
理解“¡”和“¿”在西班牙语等语言中的含义。
理解这些符号的 htmlentitity 版本。
--从原始函数中移除--

<?php
function sentenceNormalizer($sentence_split) {
$sentence_split = preg_replace(array('/[!]+/','/[?]+/','/[.]+/'),
array(
'!','?','.'),$sentence_split);

$textbad = preg_split("/(\!|\.|\?|\n)/", $sentence_split,-1,PREG_SPLIT_DELIM_CAPTURE);
$newtext = array();
$count = sizeof($textbad);

foreach(
$textbad as $key => $string) {
if (!empty(
$string)) {
$text = trim($string, ' ');
$size = strlen($text);

if (
$size > 1){
$newtext[] = ucfirst(strtolower($text));
}
elseif (
$size == 1) {
$newtext[] = ($text == "\n") ? $text : $text . ' ';
}
}
}

return
implode($newtext);
}
?>
@manzoorwanijk
5 年前
适用于 PHP < 5.4.32 以及 $delimiters

function _ucwords( $str, $delimiters = " \t\r\n\f\v" ) {

$delims = preg_split( '//u', $delimiters, -1, PREG_SPLIT_NO_EMPTY );

foreach ( $delims as $delim ) {

if ( false !== strpos( $str, $delim ) ) {

$str = implode( $delim, array_map( 'ucfirst', explode( $delim, $str ) ) );
}
}

return $str;
}
qeremy [atta] gmail [dotta] com
12 年前
一个正确的土耳其解决方案;

<?php
function ucfirst_turkish($str) {
$tmp = preg_split("//u", $str, 2, PREG_SPLIT_NO_EMPTY);
return
mb_convert_case(
str_replace("i", "İ", $tmp[0]), MB_CASE_TITLE, "UTF-8").
$tmp[1];
}

function
ucwords_turkish($str) {
return
preg_replace("/(\\w+)/ue", "ucfirst_turkish('\\\\1').'$2'", $str);
}

$str = "iyilik güzelLİK şeker ";
echo
ucwords($str) ."\\n"; // Iyilik GüzelLİK şeker
echo ucwords_turkish($str); // İyilik GüzelLİK Şeker
?>
haijerome at gmail dot com
12 年前
非常感谢兄弟。

我用了一些不同的方法测试了它。它运行良好。它确实是现有函数的极佳且简单的用法。如果此类函数将在未来的 PHP 版本中包含在 PHP 库中,那将令所有 PHP 人员感到高兴,并有益于 PHP。

<?php

$name1
= "mark-yves robert";
$name2 = "mark-yves robert-bryan";

echo
'<br/>Name 1 (mark-yves robert) =>'.
ucwordspecific($name1,'-'); //returns Mark-Yves Robert

echo '<br/>Name 2 (mark-yves robert-bryan)

=>'
.ucwordspecific($name2,'-');
//returns Mark-Yves Robert-Bryan

function ucwordspecific($str,$delimiter){
$delimiter_space = '- ';
return
str_replace($delimiter_space,$delimiter,ucwords

(str_replace($delimiter,$delimiter_space,$str)));
}

?>

很荣幸一直是 PHP 爱好者 :-)
Greg S
15 年前
我做了与 Catalin 相同的事情,但针对法语姓名。

以下是我正在做的事情

对于每个单词(不考虑单引号作为单词边界字符)
- 将单词转换为小写
- 如果单词是“de”,则返回,否则将第一个字母转换为大写
- 查看单词的第二个字符是否为单引号
- 是?将下一个字符转换为大写
- 并且如果单引号之前的字符是 D,则将其恢复为小写(-> d)

这符合法语姓名中大写规则。

示例结果
-d'Afoo Bar
-de Foo Bar
-O'Foo Bar
-Foo'bar

<?php
function my_ucwords($s) {
$s = preg_replace_callback("/(\b[\w|']+\b)/s", fixcase_callback, $s);

return
$s;

}

function
fixcase_callback($word) {

$word = $word[1];

$word = strtolower($word);

if(
$word == "de")
return
$word;

$word = ucfirst($word);

if(
substr($word,1,1) == "'") {
if(
substr($word,0,1) == "D") {
$word = strtolower($word);
}
$next = substr($word,2,1);
$next = strtoupper($next);
$word = substr_replace($word, $next, 2, 1);
}

return
$word;
}
?>
Ismet Togay
18 年前
对 arif 的回复

我们不需要那么长的函数。为了使 ucwords() 在包含特殊字符的土耳其语单词中正常工作,我们可以在 php 代码中使用以下命令

setlocale(LC_ALL, 'tr_TR');

这将设置区域设置到土耳其语。
deepdene at email dot com
21 年前
一个了解姓名大小写(例如 McDonald 中的大写字母)的函数

function name_case($name)
{
$newname = strtoupper($name[0]);
for ($i=1; $i < strlen($name); $i++)
{
$subed = substr($name, $i, 1);
if (((ord($subed) > 64) && (ord($subed) < 123)) ||
((ord($subed) > 48) && (ord($subed) < 58)))
{
$word_check = substr($name, $i - 2, 2);
if (!strcasecmp($word_check, 'Mc') || !strcasecmp($word_check, "O'"))
{
$newname .= strtoupper($subed);
}
else if ($break)
{

$newname .= strtoupper($subed);
}
else
{
$newname .= strtolower($subed);
}
$break=0;
}
else
{
// 不是字母 - 边界
$newname .= $subed;
$break=1;
}
}
return $newname;
}
neil at no-spam-ents24 dot com
23 年前
Joerg Krause 在上面发布的代码仅适用于以某个分隔符结尾的字符串。可能的修复方法是

<?php
$text
= "What?No delimiters,shit happens here.this solves all problems.";
preg_match_all("/(\w+[,. ?])+/U", $text, $words);
preg_match("/(\w+)$/", $text, $lastword);
$words[0][] = $lastword;
foreach(
$words[0] as $part) $uwords[] = ucfirst($part);
$text = implode("", $uwords);
echo
$text;
?>
Florian
9 年前
要将像“jean-pierre”这样的姓名的首字母转换为“Jean-Pierre”

我只需将“-”替换为垂直制表符,因为 ucwords() 函数会替换它后面的字母。

所以,我使用句子
$result=str_replace(chr(11),'-',ucwords(strtolower(str_replace('-',chr(11),$firstname))));
Lech
8 年前
这将更正姓名中的大写字母,注意 Mc...、Mac... 和 O'... 的特殊大写规则。可以轻松添加其他我不了解的特殊情况。

这只是对“deepdene at email dot com”的 name_case 函数的一个小改进... 感谢您提供原始函数。

<?php

function name_case($name) {
if( !
$name ) return $name;
$newname = strtoupper($name[0]);
$break = false;
for(
$i=1; $i<strlen($name); ++$i ) {
$subed = substr($name, $i, 1);
if(
ord($subed) > 64 && ord($subed) < 123 || ord($subed) > 48 && ord($subed) < 58 ) {
if(
$break ) {
$newname .= strtoupper($subed);
}
elseif(
$i > 1 && in_array(substr($newname, $i-2, 2), array('Mc', 'O\'')) || $i > 2 && in_array(substr($newname, $i-3, 3), array('Mac')) ) {
$newname .= strtoupper($subed);
}
else {
$newname .= strtolower($subed);
}
$break = false;
}
else {
// not a letter - a boundary
$newname .= $subed;
$break = true;
}
}
return
$newname;

?>
To Top