2

Codeigniter で構築されたカスタム CMS のタグ システムをコーディングしており、特定の形式を適用しようとしています。

基本的に、小文字にする必要がある次の例外を除いて、各単語の最初の文字を大文字にする必要があります。

  • 記事: a、an、the
  • 調整接続詞: and、but、or、for、nor など。
  • 前置詞 (5 文字未満): with、on、at、to、from、by など

さらに、タグが上記のいずれかで始まる場合は、大文字にする必要があります。

適切にフォーマットされたタグの例:

  • ゲーム・オブ・スローンズ
  • ねずみと人間の
  • 最初から最後まで
  • ロード・オブ・ザ・リング
  • ニード・フォー・スピード

これまでのところ、私はただ持っています:

$tag = 'Lord of the Rings';
$tag = ucwords($tag); 

$patterns = array('/A/', '/An/', '/The/', '/And/', '/Of/', '/But/', '/Or/', '/For/', '/Nor/', '/With/', '/On/', '/At/', '/To/', '/From/', '/By/' );
$lowercase = array('a', 'an', 'the', 'and', 'of', 'but', 'or', 'for', 'nor', 'with', 'on', 'at', 'to', 'from', 'by' );

$formatted_tag = preg_replace($patterns, $lowercase, $tag);

// capitalize first letter of string
$formatted_tag = ucfirst($formatted_tag);

echo $formatted_tag;

これによりLord of the Ringsの正しい結果が生成されますが、配列の重複を避けるにはどうすればよいですか? 新しい単語を追加するときにそれらを一致させるのは面倒です。

含まれていない単語がいくつかあると思いますが、使用できる既存の関数またはクラスはありますか?

4

1 に答える 1

7

$lowercaseでカスタム コールバックを使用する場合、配列は必要ありませんpreg_replace_callback()。また、現在のメソッドには単語の境界が必要です。それ以外の場合は、またはに置き換えAndroidられます。最後に、N 個の単語に対して N 個の正規表現を作成することは非効率的であり、必要ではありません。これは 1 つの正規表現で実行できるからです。androidbAndband

単語配列を保持するだけです:

$words = array('A', 'An', 'The', 'And', 'Of', 'But', 'Or', 'For', 'Nor', 'With', 'On', 'At', 'To', 'From', 'By' );

そして、次のように、単語境界を備えた1 つの動的正規表現を作成します。

$regex = '/\b(' . implode( '|', $words) . ')\b/i';

そして、すべての一致を対応する小文字に置き換えます。

$formatted_tag = preg_replace_callback( $regex, function( $matches) {
    return strtolower( $matches[1]);
}, $tag);
于 2012-08-08T18:46:32.303 に答える