2012-07-17 4 views
5

大文字の名前のリストが提供されています。電子メールでの挨拶の目的のために、彼らには適切なケースにしてほしい。"O'Hara"、 "McDonald" "van der Sloot"などを扱う大文字の名前が適切なケースに変換された場合

PHPのucwordsを使用するだけで十分です。

それはそれほどではありませんなど、

「オハラ」、「マクドナルド」、「ファンデSloot」:しかし、私は、私のような一般的な例外を処理するために、いくつかの正規表現機能を必要と感じます私はすべての一般的な例外が何であるか分からないので、上の3つの例を扱う正規表現の文を構築するのに助けが必要です(うまくいくでしょう)。

誰かが以前にこの問題に直面したことはありませんか、公開されたソリューションや共有できるものはありますか?

+1

だから、あなたが助けを必要としません。コードと...名前のリストだけ? – vcsjones

+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. 
) 
*/ 
?> 

私は役に立つと思います。

+1

私はこれについてもう少し考えており、あなたのことは興味深いアプローチの一部だと考えています。 $ corrected_names配列が次のように生成された場合はどうなりますか?名前の大文字と小文字のパターンが複数ある場合は、電話帳や国勢調査で見つけることができるすべての名前をプルします。そうすれば、すべての名前は、その名前の最も一般的なパターンで大文字で「修正」されます。完璧?確かにそうではありません。しかし、私は完璧を良いものにしないようにしています。 – AllInOne

+0

私はそれについて考えていました。個人情報を確認するために顧客/クライアント/マーケティング部門に動機づけられる可能性があります(メールフォームまたは電話を使用することができます)。オファー、割引/ギフトのような賞のようなものかもしれません。 – quantme

2

私は、今日私が取り組んでいるアプリで実装するためにこれを書いた。私は、このコードはコメントでかなり自明だと思う。すべてのケースで100%正確ではありませんが、ほとんどの西洋人の名前を簡単に処理します。

例:

mary-jane => Mary-Jane

o'brien => O'Brien

Joël VON WINTEREGG => Joël von Winteregg

jose de la acosta => Jose de la Acosta

あなたが合うように上部の配列に任意の文字列値を追加することがあり、その中にコードが拡張可能ですあなたの要望。それを勉強し、必要な特別な機能を追加してください。

function name_title_case($str) 
{ 
    // name parts that should be lowercase in most cases 
    $ok_to_be_lower = array('av','af','da','dal','de','del','der','di','la','le','van','der','den','vel','von'); 
    // name parts that should be lower even if at the beginning of a name 
    $always_lower = array('van', 'der'); 

    // Create an array from the parts of the string passed in 
    $parts = explode(" ", mb_strtolower($str)); 

    foreach ($parts as $part) 
    { 
    (in_array($part, $ok_to_be_lower)) ? $rules[$part] = 'nocaps' : $rules[$part] = 'caps'; 
    } 

    // Determine the first part in the string 
    reset($rules); 
    $first_part = key($rules); 

    // Loop through and cap-or-dont-cap 
    foreach ($rules as $part => $rule) 
    { 
    if ($rule == 'caps') 
    { 
     // ucfirst() words and also takes into account apostrophes and hyphens like this: 
     // O'brien -> O'Brien || mary-kaye -> Mary-Kaye 
     $part = str_replace('- ','-',ucwords(str_replace('-','- ', $part))); 
     $c13n[] = str_replace('\' ', '\'', ucwords(str_replace('\'', '\' ', $part))); 
    } 
    else if ($part == $first_part && !in_array($part, $always_lower)) 
    { 
     // If the first part of the string is ok_to_be_lower, cap it anyway 
     $c13n[] = ucfirst($part); 
    } 
    else 
    { 
     $c13n[] = $part; 
    } 
    } 

    $titleized = implode(' ', $c13n); 

    return trim($titleized); 
} 
2

私は、このための小さなlibに書いた:あなたはComposerでそれをインストールすることができhttps://github.com/tamtamchik/namecase を。ご入力の場合

それはあなたが次のコードを使用して必要な正確に何生成:任意の名前の文字列のLIBに同梱されており、それが適切な場合に変換されます

<?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を。あなたの例の出力はなります場合:

O'HARA =>オハラ
MCDONALD =>マクドナルド
VAN DER SLOOT =>ファンデSloot

+0

はい - それはずっと良い答えです、アドバイスを取ってくれてありがとう。あなたのライブラリは、「MACDONALD」(https://en.wikipedia.org/wiki/Macdonald)のような名前で何をしますか?大文字の2つの形式がありますか? – Mogsdad

+1

@Mogsdadはデフォルトで 'MacDonald'に変換されますが、機能要求がある場合はこれにオプションを追加することがあります。私はオリジナルのPerlバージョンhttps://metacpan.org/pod/distribution/Lingua-EN-NameCase/READMEに固執しようとしており、MacDonaldは例外ではありません。 –

関連する問題