1

文字列を名前の正規形に正規化(正規化)したい:

  1. 名前の最初の文字は大文字です

これによる難しさは、2番目と3番目の名前でこのルールに従うことです。

私の方法:

    public function namilize($string)
{
    $strings = explode(' ', $string);
    foreach ($strings as $string) {
        $string = ucfirst(strtolower($string));
    }
    $string = implode(' ', $strings);

    return $string;
}

どういうわけか

$string = ucfirst(strtolower($string));

失敗します。

何を修正する必要がありますか?もっと良い方法はありますか?

よろしく

編集:

やあ、

コメントと回答をありがとうございました。私は別の「現代的な」方法を見つけました:

public function namilize($string)
{
    $string = mb_convert_case($string, MB_CASE_TITLE, mb_detect_encoding($string));
}

私が今、それが完了するよりも、McとOの正規表現を追加するとき:)

4

3 に答える 3

2
public function namilize($name) {
    $name = strtolower($name);
    $normalized = array();

    foreach (preg_split('/([^a-z])/', $name, NULL, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $word) {
        if (preg_match('/^(mc)(.*)$/', $word, $matches)) {
            $word = $matches[1] . ucfirst($matches[2]);
        }

        $normalized[] = ucfirst($word);
    }

    return implode('', $normalized);
}

John O'Brianこれは、、などの名前で機能することに注意してくださいJames McManus。のようなプレフィックスを持つ他の名前の場合はMcManus、単にプレフィックスを。に追加しますpreg_match()。明らかに、これは誤検知の可能性を実行しますが、100%絶対確実な方法はありません。

于 2012-04-13T15:04:47.190 に答える
1

&参照によって$stringを渡す必要があります。:に注意してください。

    public function namilize($string)
{
    $strings = explode(' ', $string);
    foreach ($strings as &$string) {
        $string = ucfirst(strtolower($string));
    }
    $string = implode(' ', $strings);

    return $string;
}

または、@thetaikoによって提案された関数を使用します ucwords($string)

于 2012-04-13T14:47:37.780 に答える
1

foreach内の$stringは、最後の反復(または最後の名前)のみを格納します。foreachの変数が出力に使用されることはないため、これは実際には問題ではありません。implodeは、explodeで行ったことを元に戻すだけなので、入力とまったく同じ出力になります。この例では、変数名をよりわかりやすいものに変更しました。

function namilize($name_in)
{
    $a_names = explode(' ', $name_in); //explode string into array
    foreach ($a_names as $name) {
        $a_fullname[] = ucfirst(strtolower($name)); //build array of proper case names
    }    
    $string = implode(' ', $a_fullname); //convert array into string
    return $string;
}
于 2012-04-13T15:04:54.327 に答える