多字节字符串 函数
在线手册:中文  英文

mb_convert_case

(PHP 4 >= 4.3.0, PHP 5)

mb_convert_case对字符串进行大小写转换

说明

string mb_convert_case ( string $str , int $mode = MB_CASE_UPPER [, string $encoding = mb_internal_encoding() ] )

对一个 string 进行大小写转换,转换模式由 mode 指定。

参数

str

要被转换的 string

mode

转换的模式。它可以是 MB_CASE_UPPERMB_CASE_LOWERMB_CASE_TITLE 的其中一个。

encoding

encoding 参数为字符编码。如果省略,则使用内部字符编码。

返回值

mode 指定的模式转换 string 大小写后的版本。

Unicode

和类似 strtolower()strtoupper() 的标准大小写转换函数相比, 大小写转换的执行根据 Unicode 字符属性的基础。 因此此函数的行为不受语言环境(locale)设置的影响,能够转换任意具有“字母”属性的字符,例如元音变音A(?)。

更多关于 Unicode 属性的信息,请查看 » http://www.unicode.org/unicode/reports/tr21/

范例

Example #1 mb_convert_case() 例子

<?php
$str 
"mary had a Little lamb and she loved it so";
$str mb_convert_case($strMB_CASE_UPPER"UTF-8");
echo 
$str// 输出 MARY HAD A LITTLE LAMB AND SHE LOVED IT SO
$str mb_convert_case($strMB_CASE_TITLE"UTF-8");
echo 
$str// 输出 Mary Had A Little Lamb And She Loved It So
?>

Example #2 非拉丁 UTF-8 文本的 mb_convert_case() 例子

<?php
$str 
"Τ?χιστη αλ?πηξ βαφ?? ψημ?νη γη, δρασκελ?ζει υπ?ρ νωθρο? κυν??";
$str mb_convert_case($strMB_CASE_UPPER"UTF-8");
echo 
$str// 输出 Τ?ΧΙΣΤΗ ΑΛ?ΠΗΞ ΒΑΦ?Σ ΨΗΜ?ΝΗ ΓΗ, ΔΡΑΣΚΕΛ?ΖΕΙ ΥΠ?Ρ ΝΩΘΡΟ? ΚΥΝ?Σ
$str mb_convert_case($strMB_CASE_TITLE"UTF-8");
echo 
$str// 输出 Τ?χιστη Αλ?πηξ Βαφ?σ Ψημ?νη Γη, Δρασκελ?ζει Υπ?ρ Νωθρο? Κυν?σ
?>

参见


多字节字符串 函数
在线手册:中文  英文

用户评论:

cataphract at php dot net (2010-07-26 11:06:15)

This is a variation of mb_convert_case that works only for UTF-8 strings and that will not convert to lowercase anything.

This avoids turning "AAA aaa" into "Aaa Aaa"; it maps "AAA aaa" into ""AAA Aaa" instead.

<?php
function mb_convert_case_utf8_variation($s) {
    
$arr preg_split("//u"$s, -1PREG_SPLIT_NO_EMPTY);
    
$result "";
    
$mode false;
    foreach (
$arr as $char) {
        
$res preg_match(
            
'/\\p{Mn}|\\p{Me}|\\p{Cf}|\\p{Lm}|\\p{Sk}|\\p{Lu}|\\p{Ll}|'.
            
'\\p{Lt}|\\p{Sk}|\\p{Cs}/u'$char) == 1;
        if (
$mode) {
            if (!
$res)
                
$mode false;
        }
        elseif (
$res) {
            
$mode true;
            
$char mb_convert_case($charMB_CASE_TITLE"UTF-8");
        }
        
$result .= $char;
    }

    return 
$result;
}
?>

agash at freemail dot hu (2009-07-19 03:27:41)

as the previouly posted version of this function doesn't handle UTF-8 characters, I simply tried to replace ucfirst to mb_convert_case, but then any previous case foldings were lost while looping through delimiters. 
So I decided to do an mb_convert_case on the input string (it also deals with words is uppercase wich may also be problematic when doing case-sensitive search), and do the rest of checking after that.

As with mb_convert_case, words are capitalized, I also added lowercase convertion for the exceptions, but, for the above mentioned reason, I left ucfirst unchanged.

Now it works fine for utf-8 strings as well, except for string delimiters followed by an UTF-8 character ("Mcádám" is unchanged, while "mcdunno's" is converted to "McDunno's" and "?kr?s-T?TH éDUa" in also put in the correct form)

I use it for checking user input on names and addresses, so exceptions list contains some hungarian words too.

<?php

function titleCase($string$delimiters = array(" ""-"".""'""O'""Mc"), $exceptions = array("út""u""s""és""utca""tér""krt""k?rút""sétány""I""II""III""IV""V""VI""VII""VIII""IX""X""XI""XII""XIII""XIV""XV""XVI""XVII""XVIII""XIX""XX""XXI""XXII""XXIII""XXIV""XXV""XXVI""XXVII""XXVIII""XXIX""XXX" )) {
       
/*
        * 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($stringMB_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;


?>

the at psychoticneurotic dot com (2009-04-08 10:03:40)

Building upon Justin's and Alex's work... 

This function allows you to specify which delimiter(s) to explode on (not just the default space). Now you can correctly capitalize Irish names and hyphenated words (if you want)!

<?php
function titleCase($string$delimiters = array(" ""-""O'"), $exceptions = array("to""a""the""of""by""and""with""II""III""IV""V""VI""VII""VIII""IX""X")) {
       
/*
        * 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
        */
       
foreach ($delimiters as $delimiter){
               
$words explode($delimiter$string);
               
$newwords = array();
               foreach (
$words as $word){
                       if (
in_array(strtoupper($word), $exceptions)){
                               
// check exceptions list for any words that should be in upper case
                               
$word strtoupper($word);
                       } elseif (!
in_array($word$exceptions)){
                               
// convert to uppercase
                               
$word ucfirst($word);
                       }
                       
array_push($newwords$word);
               }
               
$string join($delimiter$newwords);
       }
       return 
$string;
}
?>

Justin (2008-12-17 08:42:55)

Retouching Alex's example so it works:
function titleCase($string, $exceptions = array('to', 'a', 'the', 'of', 'by', 'and', 'with', 'UI', 'V','X')) {

$words = explode(" ", $string);
$newwords = array();
foreach ($words as $word)
{
if (!in_array($word, $exceptions)) {
$word = strtolower($word);
$word = ucfirst($word);
}
array_push($newwords, $word);
}
return join(" ", $newwords);
}
It doesn't work for Irish names, etc. So keep that in mind.

info at yasarnet dot com (2008-07-03 23:57:00)

For my case following did the work to capitalize UTF-8 encoded string.
function capitalize($str, $encoding = 'UTF-8') {
return mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding) . mb_strtolower(mb_substr($str, 1, mb_strlen($str), $encoding), $encoding);
}

thomas underscore corthals at hotmail dot com (2006-08-15 15:30:45)

If you want to capitalize the first letter of a multibyte string, you can use this function.

<?php
function capitalize($str$encoding null) {
     
$str mb_strtoupper($str{0}, $encoding) . mb_substr($str1null$encoding);
     return 
$str;
}
?>

alex at agileware dot net (2006-02-06 18:02:16)

This function is a bit more flexible than using mb_convert_case with MB_CASE_TITLE, because it lets you add words whose case you don't want modified.
function title_case($string, $exceptions = array('to', 'a', 'the', 'of', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X')) {
$words = split(" ", $string);
$newwords = array();
foreach ($words as $word)
{
if (!array_key_exists($word, $exceptions)) {
$word = strtolower($word);
$word = ucfirst($word);
}
array_push($newwords, $word);
}
return ucfirst(join(" ", $newwords));
}

footballkid4 at hotmail dot com (2006-02-04 08:59:51)

This function will capitalize the first letter ( the same as using mb_convert_case with MB_CASE_TITLE flag, but when using a sentence, it'll only capitalize the first word )

<?php
function capitalize(&$input) {
     
$input strtouppersubstr$input ) ).strtolowersubstr$input ) );
     return 
$input;
}
?>

Very short, uses substr, strtoupper, and strtoupper only

Rasa Ravi at tantrajoga dot cz (2005-04-30 01:36:54)

For CZECH characters:
<?php
$text 
mb_convert_case($textMB_CASE_LOWER"Windows-1251");
?>
The right encoding Windows-1250 is not valid (see the list mb_list_encodings), but Windows-1251 will do the same 100%. The function strtolower() ignores czech characters with diacritics.

易百教程