5

大文字の名前のリストが提供されます。メールでの挨拶の目的で、私は彼らが適切なケースであることを望みます.

PHP のucwordsを使用すると簡単に実行できます。しかし、次のような一般的な例外を処理するには、正規表現関数が必要だと感じています。

「オハラ」「マクドナルド」「ヴァン・デル・スロート」など

上記の 3 つの例を処理するための正規表現ステートメントを作成するのに助けが必要なほどではありません (それはいいことですが)。

確かに誰かが以前にこの問題に直面したことがあります。公開された解決策や共有できるものへのポインタはありますか?

4

3 に答える 3

2

提供された短いリストで正規表現を使用するのは簡単かもしれませんが、数百または数千のレコードを処理する必要がある場合、完全に証明することは非常に困難です。

他人に影響を与えないものを使いたい。「マクドナルド」さんが「マクドナルド」を好むかどうかはどうやってわかりますか?

あなたは他の誰かのエラーを修正しています。ソースを修正できない場合は、次のようなものを使用できます。

<?php

$provided_names = array(
  "SMITH",
  "O'HARA",
  "MCDONALD",
  "JONES",
  "VAN DER SLOOT",
  "MACDONALD"
);

$corrected_names = array(
  "O'HARA"        => "O'Hara",
  "MCDONALD"      => "McDonald",
  "VAN DER SLOOT" => "van der Sloot"
);

$email_text = array();

foreach ($provided_names as $provided_name)
{
  $provided_name = !array_key_exists($provided_name, $corrected_names) 
    ? ucwords(strtolower($provided_name)) 
    : $corrected_names[$provided_name];
  $email_text[]  = "{$provided_name}, your message text.";
}

print_r($email_text);

/* output:
Array
(
  [0] => Smith, your message text.
  [1] => O'Hara, your message text.
  [2] => McDonald, your message text.
  [3] => Jones, your message text.
  [4] => van der Sloot, your message text.
  [5] => Macdonald, your message text.
)
*/
?>

役に立つことを願っています。

于 2012-07-17T23:45:25.323 に答える
2

このための小さなライブラリを作成しました: https://github.com/tamtamchik/namecase Composer でインストールできます。

入力については、次のコードを使用して必要なものを正確に生成します。

<?php

require_once 'vendor/autoload.php'; // Composer autoload

$arr = ["O'HARA", "MCDONALD", "VAN DER SLOOT"];

foreach ($arr as $name) {
    echo $name . ' => ' . str_name_case($name) . PHP_EOL;
}

str_name_case任意の名前文字列でライブラリに同梱されている関数を呼び出すと、適切な大文字と小文字に変換されます。あなたの例では、出力は次のようになります。

オハラ => オハラ
マクドナルド => マクドナルド
ヴァン デル スロート => ヴァン デル スロート

于 2016-03-22T11:09:14.323 に答える