PHP Conference Japan 2024

ucwords

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

ucwords將字串中每個單字的字首改為大寫

說明

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

如果 string 中每個單字的首字元是介於 "a" (0x61) 和 "z" (0x7a) 之間的 ASCII 字元,則傳回每個單字的首字元改為大寫的字串。

對於此函式,單字是指未列在 separators 參數中的一串字元。預設情況下,這些是:空格、水平定位、歸位、換行、換頁和垂直定位。

若要在多位元組字串上進行類似的轉換,請使用 mb_convert_case()MB_CASE_TITLE 模式。

參數

字串

輸入字串。

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 則註解

39
antoniomax at antoniomax dot com
11 年前
Para formatar nomes em pt-br

<?php

function titleCase($string, $delimiters = array(" ", "-", ".", "'", "O'", "Mc"), $exceptions = array("de", "da", "dos", "das", "do", "I", "II", "III", "IV", "V", "VI"))
{
/*
* Exceptions in lower case are words you don't want converted
* Exceptions all in upper case are any words you don't want converted to title case
* but should be converted to upper case, e.g.:
* king henry viii or king henry Viii should be 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)) {
// check exceptions list for any words that should be in upper case
$word = mb_strtoupper($word, "UTF-8");
} elseif (
in_array(mb_strtolower($word, "UTF-8"), $exceptions)) {
// check exceptions list for any words that should be in upper case
$word = mb_strtolower($word, "UTF-8");
} elseif (!
in_array($word, $exceptions)) {
// convert to uppercase (non-utf8 only)
$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'
?>
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 迴圈陣列中新增更多分隔符號。
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」
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
4
almino dot melo at gmail dot com
8 年前
在巴西,適用於人名的 ucwords。
為巴西人名客製化的 ucwords。

<?php
/**
* 在巴西,適用於人名的 ucwords
* 從 https://php.dev.org.tw/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;
}
?>
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 程式碼,請見諒,這不是我的錯!)

這不會跳脫單字中間出現的單引號... 雖然,你可能會發現如果你在單字中使用其他特殊字元,並且得到奇怪的輸出,你可能需要在正規表示式中加入其他字元。

但這是一個很棒的表達式!簡單但非常強大。讚!
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() 的函式速度最快。
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);
}
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
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'
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
4
strazds at gmail dot com
16 年前
用於 UTF-8 字串的 ucwords

<?php
function mb_ucwords($str) {
$str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8");
return (
$str);
}
?>
4
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
2
Anonymous
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);
}

[編者註:修復了程式碼使其正確]
4
Anonymous
18 年前
"ieure at php dot net",你的想法真是詩意!

下面的函數將標準化人名以及報告和論文標題的 capitalization 。您可能需要調整 "$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」
1
barnaby ritchley at exeye dot co dot uk
17 年前
一種非常簡單的轉換為首字母大寫的方法

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

$myString = "SOME TEXT";

echo titleCase($myString);

//將列印,"My Text"
0
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;
}
?>
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
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);
}
?>
-1
@manzoorwanijk
6 年前
適用於具有 $delimiters 的 PHP < 5.4.32

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;
}
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
?>
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 的愛好者 :-)
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;
}
?>
0
Ismet Togay
18 年前
回覆給 arif

我們不需要這麼長的函式。為了讓 ucwords() 在土耳其語單字中(包含特殊字元)正常運作,我們可以在 PHP 程式碼中使用以下命令:

setlocale(LC_ALL, 'tr_TR');

這會將地區設定設為土耳其語。
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;
}
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;
?>
-1
Florian
9 年前
將名字中的首字母轉換,例如: "jean-pierre" 轉換為 "Jean-Pierre"

我只是簡單地將 '-' 替換為垂直製表符,因為 ucwords() 函數會替換它之後的字母。

所以,我使用以下語句:
$result=str_replace(chr(11),'-',ucwords(strtolower(str_replace('-',chr(11),$firstname))));
-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