web-dev-qa-db-ja.com

文字列の最初の文字を大文字にし、残りを小文字にする

すべて、データベースに姓を挿入しようとしています。名前の最初の文字を大文字にし、姓が2つある場合は、最初と2番目の名前を大文字にします。たとえば、誰かが入力した場合:

結婚した

3つ以上の名前がある場合、これをMarriedname Maidennameなどに変換します。もう1つのシナリオは、名前にアポストロフィが含まれている人がいるため、誰かが入力した場合にそれを行う方法があります。

オコネル

これはO'Connellに変換する必要があります。私が使用していた:

ucfirst(strtolower($last_name));

ただし、すべてのシナリオで機能するとは限りません。アドバイスをありがとう!

41
user1048676

これにより、Wordの最初のすべての文字、およびアポストロフィの直後の文字が大文字になります。他のすべての文字は小文字になります。それはあなたのために働くはずです:

str_replace('\' ', '\'', ucwords(str_replace('\'', '\' ', strtolower($last_name))));
35
Paulpro

あなたはWordのこれを試すことができます

<?php echo ucwords(strtolower('Dhaka, JAMALPUR, sarishabari')) ?>

結果:Dhaka, Jamalpur, Sarishabari

22
user4382407

これらはいずれもUTF8に対応していないため、ここまで問題なく動作するものがあります(これまでのところ)

function titleCase($string, $delimiters = array(" ", "-", ".", "'", "O'", "Mc"), $exceptions = array("and", "to", "of", "das", "dos", "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;
}

使用法:

$s = 'SÃO JOÃO DOS SANTOS';
$v = titleCase($s); // 'São João dos Santos' 
21
Antonio Max

この組み込み関数を使用します。

ucwords('string');
5
jalalkhan121

私はあなたのためにすべてのシナリオをカバーする1つの良い答えがあるとは思わない。 ucwords のPHP.netフォーラムにはかなりの議論がありますが、誰もが答えを出していないようです。大文字を使用するか、ユーザーの入力をそのままにして標準化することをお勧めします。

2
Steve Orman

_preg_replace_をeフラグと共に使用できます(php関数を実行します):

_function processReplacement($one, $two)
{
  return $one . strtoupper($two);
}

$name = "bob o'conner";
$name = preg_replace("/(^|[^a-zA-Z])([a-z])/e","processReplacement('$1', '$2')", $name);

var_dump($name); // output "Bob O'Conner"
_

おそらく正規表現パターンは改善される可能性がありますが、私がやったことは次のとおりです。

  • _$1_は、行の先頭またはアルファベット以外の文字のいずれかです。
  • _$2_は任意の小文字のアルファベット文字です

次に、これらの両方を単純なprocessReplacement()関数の結果に置き換えます。

PHP 5.3を持っている場合は、processReplacement()を匿名関数にする価値があるでしょう。

1
Abhi Beckert

これは、メインの質問に対するもう少しシンプルで直接的な回答です。以下の関数はPHPアプローチを模倣します。PHP将来的に名前空間でこれを拡張する場合、テストが最初にチェックされます。この水を使用しています。 my wordpress installs。

$str = mb_ucfirst($str, 'UTF-8', true);

これにより、最初の文字が大文字になり、Qのように他のすべてが小文字になります。 3番目の引数がfalse(デフォルト)に設定されている場合、残りの文字列は操作されません。

// Extends PHP
if (!function_exists('mb_ucfirst')) {

function mb_ucfirst($str, $encoding = "UTF-8", $lower_str_end = false) {
    $first_letter = mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding);
    $str_end = "";
    if ($lower_str_end) {
        $str_end = mb_strtolower(mb_substr($str, 1, mb_strlen($str, $encoding), $encoding), $encoding);
    } else {
        $str_end = mb_substr($str, 1, mb_strlen($str, $encoding), $encoding);
    }
    $str = $first_letter . $str_end;
    return $str;
}

}

/ランドマン

1
Jonas Lundman

このように使用しますucfirst(strtolower($var));

0
chgav007

PHPでは、strtolowerおよびucwords関数を使用できます。

最初:strtolower('inputtedtext') then capitalise all text using ucwords( 'strtolower') `を使用して、入力されたすべてのテキストを下げます。

サンプル :

_$text = 'tHis iS sOme tEXt'; <br>
$lower = strtolower($text); &ensp; //this will lower all letter from the text <br>
$upper = ucwords($lower); &ensp; //this will uppercase all first letter from the text <br>

echo $upper;
_

結果=これはテキストです

ucwords(strtolower($text));でこれに1行のコードを使用できます

0
Irfan Dona

最初にタイトルケースに変換してから、最初のアポストロフィを見つけて、NEXT文字を大文字にします。アポストロフィの後にcharがあることを確認するために、多くのチェックを追加する必要があります。このコードは1つのアポストロフィでのみ機能します。例えば「メアリー・オキャラハン・オコネル」。

$str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8");
$pos = strpos($str, "'");
if ($pos != FALSE)
{
     $str[$pos+1] = strtoupper($str[$pos+1]);
}
0
Fletch