PHP 5.6.0beta1 released

mb_convert_case

(PHP 4 >= 4.3.0, PHP 5)

mb_convert_case文字列に対してケースフォルディングを行う

説明

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

mode で指定された方法で string に対してケースフォルディングを行います。

パラメータ

str

変換される文字列。

mode

変換モード。 MB_CASE_UPPERMB_CASE_LOWER あるいは MB_CASE_TITLE のいずれかです。

encoding

encoding パラメータには文字エンコーディングを指定します。省略した場合は、 内部文字エンコーディングを使用します。

返り値

mode で指定された方法で string に対してケースフォルディングを行った結果を返します。

Unicode

標準のケースフォルディング関数である strtolower()strtoupper() と違い、ケースフォルディングは Unicode 文字属性を基準に行われます。したがって、この関数の挙動は ロケールの設定に影響されず、また、すべてのアルファベット、 例えば A ウムラウト (Ä) を変換することができます。

Unicode 文字属性についての詳細は » http://www.unicode.org/unicode/reports/tr21/ を参照してください。

例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// Prints MARY HAD A LITTLE LAMB AND SHE LOVED IT SO
$str mb_convert_case($strMB_CASE_TITLE"UTF-8");
echo 
$str// Prints Mary Had A Little Lamb And She Loved It So
?>

例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// 結果は Τάχιστη Αλώπηξ Βαφήσ Ψημένη Γη, Δρασκελίζει Υπέρ Νωθρού Κυνόσ
?>

参考

add a note add a note

User Contributed Notes 7 notes

up
3
info at yasarnet dot com
5 years ago
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);
}
up
1
cataphract at php dot net
3 years ago
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, -1, PREG_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($char, MB_CASE_TITLE, "UTF-8");
        }
       
$result .= $char;
    }

    return
$result;
}
?>
up
1
alex at agileware dot net
8 years ago
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));
}
up
1
agash at freemail dot hu
4 years ago
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($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;
}

?>
up
0
the at psychoticneurotic dot com
5 years ago
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;
}
?>
up
0
Justin
5 years ago
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.
up
-1
Rasa Ravi at tantrajoga dot cz
8 years ago
For CZECH characters:
<?php
$text
= mb_convert_case($text, MB_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.
To Top