3

例外を除いて文字列内の各単語の最初の文字を大文字にするこのコードを使用するには、いくつかの助けが必要です。例外が文字列の先頭にある場合は、例外を無視する関数が必要です。

function ucwordss($str, $exceptions) {
$out = "";
foreach (explode(" ", $str) as $word) {
$out .= (!in_array($word, $exceptions)) ? strtoupper($word{0}) . substr($word, 1) . " " : $word . " ";
}
return rtrim($out);
}

$string = "my cat is going to the vet";
$ignore = array("is", "to", "the");
echo ucwordss($string, $ignore);
// Prints: My Cat is Going to the Vet

これは私がしていることです:

$string = "my cat is going to the vet";
$ignore = array("my", "is", "to", "the");
echo ucwordss($string, $ignore);
// Prints: my Cat is Going to the Vet
// NEED TO PRINT: My Cat is Going to the Vet
4

5 に答える 5

4
- return rtrim($out);
+ return ucfirst(rtrim($out));
于 2012-08-16T22:46:28.107 に答える
3

このようなもの:

function ucwordss($str, $exceptions) {
    $out = "";
    foreach (explode(" ", $str) as $key => $word) {
        $out .= (!in_array($word, $exceptions) || $key == 0) ? strtoupper($word{0}) . substr($word, 1) . " " : $word . " ";
    }
    return rtrim($out);
}

またはさらに簡単にreturn、関数の前に strtoupper の最初の文字を作成します

于 2012-08-16T22:43:58.450 に答える
1

最初の単語を常に大文字にするだけで、これを非常に安価に実行できます。

function ucword($word){
    return strtoupper($word{0}) . substr($word, 1) . " ";
}

function ucwordss($str, $exceptions) {
    $out = "";
    $words = explode(" ", $str);
    $words[0] = ucword($words[0]);
    foreach ($words as $word) {
        $out .= (!in_array($word, $exceptions)) ? ucword($word)  : $word . " ";
    }
    return rtrim($out);
}
于 2012-08-16T22:44:34.833 に答える
0

文字列の最初の文字を大文字にして、ミックスに関係なく、最初の文字を作成するのはどうですか?

$string = "my cat is going to the vet";
$string = ucfirst($string);
$ignore = array("is", "to", "the");
echo ucwordss($string, $ignore);

このように、文字列の最初の文字は常に大文字になります

于 2012-08-16T22:56:17.120 に答える
0

preg_replace_callback()条件付き置換ロジックをループのない動的な方法で表現できます。サンプル データを適切に変更する次のアプローチを検討してください。

コード: ( PHP デモ) (パターンデモ)

$string = "my cat is going to the vet";
$ignore = array("my", "is", "to", "the");
$pattern = "~^[a-z]+|\b(?|" . implode("|", $ignore) . ")\b(*SKIP)(*FAIL)|[a-z]+~";
echo "$pattern\n---\n";
echo preg_replace_callback($pattern, function($m) {return ucfirst($m[0]);}, $string);

出力:

~^[a-z]+|\b(?|my|is|to|the)\b(*SKIP)(*FAIL)|[a-z]+~
---
My Cat is Going to the Vet

ご覧のとおり、パターンの 3 つのパイプ部分は (順番に) 次の要求を行います。

  1. 文字列の先頭が単語の場合は、最初の文字を大文字にします。
  2. 「完全な単語」(\b単語境界のメタキャラクタを利用) が「ブラックリスト」で見つかった場合、一致を不適格とし、入力文字列をトラバースし続けます。
  3. それ以外の場合は、すべての単語の最初の文字を大文字にします。

ここで、短縮形とハイフンでつながれた単語にこだわりたい場合は、次のように文字クラスに'andを追加するだけです: ( Pattern Demo )-[a-z][a-z'-]

誰かが私のスニペットを壊すフリンジケース(エスケープする必要がある特殊文字を含む「単語」などpreg_quote())を持っている場合は、それらを提供でき、私はパッチを提供できますが、私の元のソリューションは投稿された質問に適切に対応します.

于 2018-12-03T04:07:12.197 に答える