2012-10-17 32 views
12

幼兒園101教我們一些人:「你名字中的字母應該是小寫字母,大寫首字母。」然而在這個文學後的時代,人們如何以網絡形式輸入他們的名字似乎取決於他們的情緒,或太陽耀斑或什麼:所有大寫字母,全部小寫字母,混合,顛倒......任何人都知道一個優雅的函數來修復名稱情況?

從哲學上說,我說隨你!佔據你的名字,誰在乎。但我有強迫症患者更喜歡看數據規範化,標準化,可預測。所以我問你們,如果你已經看到了外殼體固定名稱的深思熟慮了PHP功能,即考慮到各種例外ucwords()將完全屠夫,如:

  • Sven-亞歷克斯西雅圖的人氣
  • 羅納爾多McDonaldo
  • Boopsie奧布萊恩
  • JR鮑勃·多布斯
  • 弗朗西斯德洛斯加託斯
  • YungCheng李

那裏試圖容納這些字母反叛者的任何功能?

UPDATE
從廂式塔格羅賓訴G.的角度來看,不能有任何的腳本來統治他們。但我已經決定,名字完全以小寫或大寫字母輸入可能是一個很好的清理的候選人。因此,對於這些,我會做...

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

這將是很容易修改此修復幾個可能的例外:破折號,省略號,「麥當勞」等就要犯錯誤,但是誰抱怨?不是那些以小寫字母輸入名字的溫順混蛋。

哦,等等,我的名字是小寫...

+0

upvoted你的問題只是** J.R。鮑勃多布斯**。 – ocodo

回答

7

這是根本不可能的。

姓名的拼寫因國家/地區而異,正如您在問題中顯示的一樣。最簡單的方法是找到最常用的拼寫方式,那就是將每個「單詞」的每個首字母大寫,即每個以空格,連字符,點或引號開頭的字符串。

這並不能解決你所有的問題(容城,麥當勞),並且還給你留下了其他問題,但這與你將要得到的一樣接近。

比較:

  • 亞歷克斯·範·海倫(美國拼寫)
  • 亞歷克斯·範·海倫(正確的荷蘭語拼寫)

有沒有算法解決這個。

This article很好地說明了荷蘭名字的問題,這只是一種語言。世界上每種語言都可能有這樣的文章。;)

+0

好一點,我沒有考慮到麪包車/範糾葛。我想一個解決辦法是檢查是否有輸入的名稱完全是大寫或小寫,然後才通過一些功能運行名。 – neokio

+0

是啊,你有沒有注意到在我的用戶名的「V」?如果某人或某人強調了這一點,我會討厭它。只是感覺不對。你確實可以擴展你的邏輯,看看是否有人輸入了任何首都,並據此採取行動。 (或者告訴你的客戶這是不可能的,並且可能更便宜,讓它人爲固定。) – Sherlock

+1

嘗試容納字母反叛者並不是不可能的,這就是問題! – davidkonrad

5

下面是一個嘗試

$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沒有考慮區域/文化習俗的護理算法和巨大的名稱數據庫與...比較。

+1

尼斯之一!嚴謹的邏輯:) – neokio

0

我找到了一個體面的庫來處理用python編寫的不同格式的各種人稱,稱爲nameparser。它仍然沒有處理上面列出的所有名稱,但也有一些configuration你也許可以親近。

我也寫了一個短blog描述如何得到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 
}) 
相關問題