15

Kindergarten 101 では、「名前の文字は小文字で、最初の文字は大文字にする必要があります」と教えている人もいます。しかし、このポストリテラシーの時代では、人々がウェブフォームに自分の名前を入力する方法は、気分や太陽フレアなどに依存しているようです: すべて大文字、すべて小文字、混合、逆さま...

哲学的に、私は何でも言います!誰が気にする、あなたの名前を占有します。しかし、データを正規化、標準化、予測可能にすることを好む OCD クライアントがいます。だから私は皆さんに、次のucwords()ような完全に解体するさまざまな例外を考慮に入れた、大文字と小文字を区別する名前のためのよく考えられた PHP 関数を見たことがあるかどうかを尋ねています。

  • スヴェン・アレックス・クランペット
  • ロナウド・マクドナルド
  • ブープシー・オブライエン
  • JRボブ・ドブス
  • フランチェスカ・デ・ロス・ガトス
  • ヨンチェン・リー

これらのアルファベットの反逆者に対応しようとする関数はありますか?

更新
Robin v. G. のヴァンテージの観点から、それらすべてを支配する台本はあり得ません。しかし、完全に小文字または大文字で入力された名前は、適切なスクラビングの候補である可能性が高いと判断しました。だから、これらのために、私はやります...

    if ($name == strtoupper($name) || $name == strtolower($name)) {
        $name = ucwords(strtolower($name));
    }

ダッシュ、アポストロフィ、'McD' など、いくつかの例外を修正するためにこれを変更するのは簡単です。間違いは起こりますが、誰が文句を言うでしょうか? 小文字で名前を入力したおとなしい野郎ではありません。

ちょっと待って、私の名前は小文字です...

4

4 に答える 4

8

これは単純に不可能です。

質問に示されているように、名前のスペルは国によって異なります。最も簡単な方法は、最も一般的なスペルの方法を見つけることです。これは、すべての「単語」の最初の文字、つまり、スペース、ハイフン、ドット、またはアポストロフィが前に付いたすべての文字列を大文字にすることです。

これはすべての問題(YungCheng、McDonaldo)を修正するわけではなく、他の問題も残しますが、これはあなたが得るのと同じくらい近いです。

比較:

  • アレックスヴァンヘイレン(米国のスペル)
  • Alex van Halen(正しいオランダ語のスペル)

これを修正するアルゴリズムはありません。

この記事では、オランダ語の名前の問題を非常によく説明しています。これは1つの言語にすぎません。おそらく、世界中のすべての言語にこのような記事があります。;)

于 2012-10-17T06:35:46.447 に答える
6

ここで試してみてください

$names=array();
$names[]="sven-alex crumpet";
$names[]="RONALDO McDonalDO";
$names[]="Boopsie o'Brien";
$names[]="j.r. BOB DOBBS";
$names[]="francesca DE LOS gatOS";
$names[]="yungcheng LI";
$names[]="mr hankey";
$names[]="santas little helper";
$names[]="j.r.r. tolkien";

$splitters=array(' ','.',"'",'-'); //more to come
$fixedNames=array();

foreach($names as $name) {
    $fixed='';
    $blank=str_replace($splitters,'?',$name);
    $n=explode('?',$blank);
    foreach($n as $f) $fixed.=ucfirst(strtolower($f)).' ';
    for ($i=0;$i<strlen($fixed);$i++) {
        if ($fixed[$i]==' ') {
            if ($blank[$i]=='?') {
                $fixed[$i]=$name[$i];
            }
        }
    }
    $fixedNames[]=substr_replace($fixed,'', -1);
}

echo '<pre>';
print_r($fixedNames);
echo '<pre>';

出力

Array
(
    [0] => Sven-Alex Crumpet
    [1] => Ronaldo Mcdonaldo
    [2] => Boopsie O'Brien
    [3] => J.R. Bob Dobbs
    [4] => Francesca De Los Gatos
    [5] => Yungcheng Li
    [6] => Mr Hankey
    [7] => Santas Little Helper
    [8] => J.R.R. Tolkien
)

YungCheng のような名前を「修正」することは、地域/文化的慣習を処理するアルゴリズムと比較するための巨大な名前データベースなしでは不可能です。

于 2012-10-17T07:17:59.303 に答える
-1

nameparserというPythonで書かれたさまざまな形式のさまざまな人間の名前を処理する適切なライブラリを見つけました。上記のすべての名前を処理できるわけではありませんが、いくつかの構成を使用すると、それに近づくことができる場合があります。

また、nameparser ライブラリを端末から動作させる方法を説明する短いブログも書きました。多分それは誰かを助けるでしょう。

基本的な python スクリプトは次のとおりです。

import sys
import json
from nameparser import HumanName

rawname = ' '.join(sys.argv[1:]).lower().strip()

name = HumanName(rawname)

# attempt to fix name title case
name.capitalize()

print json.dumps({
    'fullname': name.__str__(),
    'title': name.title,
    'first': name.first,
    'middle': name.middle,
    'last': name.last,
    'suffix': name.suffix,
    'nickname': name.nickname
})
于 2014-11-30T02:52:57.253 に答える