0

文の最初の単語の最初の文字を大文字にする関数は次のとおりです。

function sentenceCase($str)
{
    $cap = true;
    $ret = '';
    for ($x = 0; $x < strlen($str); $x++) {
        $letter = substr($str, $x, 1);
        if ($letter == "." || $letter == "!" || $letter == "?") {
            $cap = true;
        } elseif ($letter != " " && $cap == true) {
            $letter = strtoupper($letter);
            $cap = false;
        }
        $ret .= $letter;
    }
    return $ret;
}

「例文」を「例文」に変換します。問題は、UTF-8 文字を大文字にしないことです。この例を参照してください。

私は何を間違っていますか?

4

1 に答える 1

4

コードに UTF-8 を認識させる最も簡単な方法は、後者が表示される 3 つのケースで単純なダム関数の代わりにmbstring関数を使用することです。

function sentenceCase($str)
{
    $cap = true;
    $ret = '';
    for ($x = 0; $x < mb_strlen($str); $x++) {      // mb_strlen instead
        $letter = mb_substr($str, $x, 1);           // mb_substr instead
        if ($letter == "." || $letter == "!" || $letter == "?") {
            $cap = true;
        } elseif ($letter != " " && $cap == true) {
            $letter = mb_strtoupper($letter);       // mb_strtoupper instead
            $cap = false;
        }
        $ret .= $letter;
    }
    return $ret;
}

その後、UTF-8 文字列を使用するように構成でき、mbstring準備が整いました。

mb_internal_encoding('UTF-8');
echo sentenceCase ("üias skdfnsknka");

ボーナスソリューション

特に UTF-8 の場合は、正規表現を使用することもできます。これにより、コードが少なくなります。

$str = "üias skdfnsknka";
echo preg_replace_callback(
    '/((?:^|[!.?])\s*)(\p{Ll})/u',
    function($match) { return $match[1].mb_strtoupper($match[2], 'UTF-8'); },
    $str);
于 2013-09-17T08:43:11.103 に答える