PHP Conference Japan 2024

ucwords

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

ucwords将字符串中每个单词的首字符转换为大写

说明

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

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

对于此函数,单词是由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
?>

注释

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

参见

添加注释

用户贡献的注释 28 条注释

up
39
antoniomax at antoniomax dot com
11 年前
格式化巴西葡萄牙语名字

<?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'
?>
up
45
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 循环数组中添加更多分隔符。
up
3
NOSPAM dot php at my dot jrklein dot com
4 年前
基于“匿名”于 2005 年 12 月 14 日最初发布的代码示例。preg_replace() 不再支持 /e 修饰符。改写为使用 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"
up
20
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));
?>

当然,这些并不是 100% 对称的。例如...
* this_is_a_string -> ThisIsAString -> this_is_astring
* GetURLForString -> get_urlfor_string -> GetUrlforString
up
4
almino dot melo at gmail dot com
8 年前
巴西人名的 ucwords。
ucwords personalizada para nomes próprios brasileiros。

<?php
/**
* 巴西人名首字母大写函数
* 修改自 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;
}
?>
up
7
lev at phpfox dot com
18 年前
在 ieure at 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 代码,请见谅;这不是我的错!)

这将不会转义出现在单词中间的单引号...但是,如果您在单词内部使用其他特殊字符并且输出结果不正常,则可能需要在正则表达式中添加其他字符。

这是一个很棒的表达式!简单但非常强大。赞!
up
4
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;
}
?>

我使用带有“e”修饰符的 preg_replace()、preg_replace_callback() 和逐字符解析的函数对其进行了速度测试。出乎意料的是,这个使用 join()、array_map() 和 explode() 的函数速度最快。
up
3
blake at goinoutwest dot com
16 年前
关于匿名用户发布的 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);
}
up
11
ahmet363 at gmail dot com
13 年前
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
up
10
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'
up
12
Luca Borrione luca -a email -d c_o_m
12 年前
特性
- 兼容多字节
- 处理多个分隔符

<?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
up
4
strazds 在 gmail 点 com
16 年前
UTF-8 字符串的 ucwords

<?php
function mb_ucwords($str) {
$str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8");
return (
$str);
}
?>
up
4
Q1712 在 online 点 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
up
2
匿名
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);
}

[编者注:修复了代码以使其正确]
up
4
匿名
18 年前
"ieure 在 php 点 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"
up
1
barnaby ritchley 在 exeye 点 co 点 uk
17 年前
一个非常简单的转换为标题大小写的方法

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

$myString = "SOME TEXT";

echo titleCase($myString);

// 将打印 "Some Text"
up
0
ganzales 在 inbox 点 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;
}
?>
up
0
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
up
1
Alex
16 年前
由 gregomm 修改的句子规范化函数

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

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

<?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);
}
?>
up
-1
@manzoorwanijk
6 年前
针对 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;
}
up
0
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
?>
up
0
haijerome at gmail dot com
13 年前
非常感谢兄弟。

我用几个变体测试了一下。它完美运行。现有函数的这种用法真是太棒了,也太简单了。如果这些函数能在即将发布的 PHP 库中出现,那将是所有 PHP 爱好者的福音,对 PHP 也是一件好事。

<?php

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

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

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

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

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

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

?>

始终以成为 PHP 爱好者为荣 :-)
up
0
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;
}
?>
up
0
Ismet Togay
18 年前
回复 arif

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

setlocale(LC_ALL, 'tr_TR');

这将把区域设置为土耳其语。
up
0
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;
}
up
0
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;
?>
up
-1
Florian
9 年前
将名字中的首字母转换为大写,例如:"jean-pierre" 转换为 "Jean-Pierre"

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

所以,我使用句子:
$result=str_replace(chr(11),'-',ucwords(strtolower(str_replace('-',chr(11),$firstname))));
up
-2
Lech
9 年前
这将纠正名称中的大写,注意 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 {
// 不是字母 - 是一个边界
$newname .= $subed;
$break = true;
}
}
return
$newname;

?>
To Top