2

すべての文の最初の文字を大文字にするはずの関数がありますが、何らかの理由で最初の文の最初の文字にそれを行っていません。なぜそれが起こっているのですか、どうすれば修正できますか?

<?php

function ucAll($str) {

$str = preg_replace_callback('/([.!?])\s*(\w)/', 
create_function('$matches', 'return strtoupper($matches[0]);'), $str);
return $str;

} //end of function ucAll($str)

$str = ucAll("first.second.third");
echo $str;

?>

結果:

first.Second.Third

期待される結果:

First.Second.Third
4

5 に答える 5

1

.正規表現では のいずれか、!またはその前にある必要があるため、最初の単語は大文字になりません?。最初の単語の前にこれらの文字がありません。

これはそれを行います:

function ucAll($str) {
    return preg_replace_callback('/(?<=^|[\.\?!])[^\.]/', function ($match) {
        return strtoupper($match[0]);
    }, $str);
}

肯定的な後読みを使用して.、 、!?、または行頭のいずれかが一致した文字列の前にあることを確認します。

于 2016-02-29T05:05:20.493 に答える
0

これは、正規表現が、定義した一連の句読点の後の文字にのみ一致し、最初の単語がそれらのいずれにも続かないために発生しています。これらの変更を行うことをお勧めします。

まず、このグループは文字列の先頭 ( ) と、置き換えようとしている (オプションの) スペースと単語文字の前の句読点のリストに([?!.]|^)一致します。^このように設定すると、文字列の先頭にスペースがあっても機能するはずです。

create_function第 2 に、PHP >= 5.3 を使用している場合は、代わりに無名関数を使用することをお勧めします。これは、現時点でうまくいくことを願っています (そうでない場合は、関数の正規表現を変更するだけで機能するはずです)。

function ucAll($str) {
    return preg_replace_callback('/([?!.]|^)\s*\w/', function($x) {
        return strtoupper($x[0]);
    }, $str);
}
于 2016-02-29T04:45:23.473 に答える
0

このようなもの :

    function ucAll($str) {
            $result = preg_replace_callback('/([.!?])\s*(\w)/',function($matches) {
            return strtoupper($matches[1] . ' ' . $matches[2]);
            }, ucfirst(strtolower($str)));
             return $result;

            } //end of function ucAll($str)
$str = ucAll("first.second.third");
echo $str;

出力:

初め。2番。三番

于 2016-02-29T03:31:05.833 に答える
0

これを試して

function ucAll($str) {

$str = preg_replace_callback('/([.!?])\s*(\w)|^(\w)/', 
create_function('$matches', 'return strtoupper($matches[0]);'), $str);
return $str;

} //end of function ucAll($str)

$str = ucAll("first.second.third");
echo $str;

|^(\w)「または最初の文字を取得」

于 2016-02-29T03:12:35.417 に答える
0

私はあなたの正規表現を更新し、ucwords代わりにstrtoupperlike asを使用しました

function ucAll($str) {
    return preg_replace_callback('/(\w+)(?!=[.?!])/', function($m){
        return ucwords($m[0]);
    }, $str);
}
$str = ucAll("first.second.third");
echo $str;
于 2016-02-29T05:48:25.310 に答える