有人有一个PHP函数来正确地大写人名吗?
问题描述:
我正在寻找一个功能正确利用像麦当劳,杰拉德,麦克阿瑟,O'Lunney的西奥德若特的名字,等有人有一个PHP函数来正确地大写人名吗?
有谁知道一个工程resonably很好的?我猜测任何函数都不会支持每一种可能性。
当然单独ucwords这不起作用,因为它只是大写每个单词的第一个字母。
编辑:我知道会有问题,所有的可能性都不会得到支持。但是这个问题现在的问题是我有一个在所有瓶盖大都进入了约50 000名的数据库,这将是一个痛苦的屁股不得不修改每一个,而不会导致拼写错误。有一个脚本导致20%的问题会快得多,并导致更少的错误。
答
你可能意识到了这一点,但你会面临一个很大的问题是,有一些名字不止一个“正确”的资本 - 在你的例子我与杰拉德不以为然,例如。
+0
这是真的,但同样,这只是一个普遍的修复。现在我有数据库,大于50%的人都输入了全部大写。 – 2009-07-30 19:04:27
答
一般我用
$output = trim(implode('-', array_map('ucfirst', explode('-', ucwords(strtolower(str_replace('_',' ',$input)))))));
方便的,如果你是存储_
代替空格在您的数据库,或者在URL中使用它们,处理复姓名字也很好。
也看到了这个地方,似乎做在大多数情况下
/**
* @param $string
* @return string
*/
public function titleCase($string)
{
$word_splitters = array(' ', '-', "O'", "L'", "D'", 'St.', 'Mc', 'Mac');
$lowercase_exceptions = array('the', 'van', 'den', 'von', 'und', 'der', 'de', 'di', 'da', 'of', 'and', "l'", "d'");
$uppercase_exceptions = array('III', 'IV', 'VI', 'VII', 'VIII', 'IX');
$string = strtolower($string);
foreach ($word_splitters as $delimiter) {
$words = explode($delimiter, $string);
$newwords = array();
foreach ($words as $word) {
if (in_array(strtoupper($word), $uppercase_exceptions))
$word = strtoupper($word);
else
if (!in_array($word, $lowercase_exceptions))
$word = ucfirst($word);
$newwords[] = $word;
}
if (in_array(strtolower($delimiter), $lowercase_exceptions))
$delimiter = strtolower($delimiter);
$string = join($delimiter, $newwords);
}
return $string;
}
的名称,如尤尔根·马乔(足球运动员)是虽然返回尤尔根·马乔一份好工作,在其他的答案和评论,名字中指出很难。
您可能没有多少运气这个问题的一些名字不是你认为他们应该的方式总是大写。例如,我比菲茨杰拉德更经常看到菲茨杰拉德。谁能说它不应该是一个连字符的名字,比如Fitz-Gerald? – Tim 2009-07-30 19:05:15
从那里下面说什么;而且,许多荷兰名(例如)没有所有的第一个字符大写,如“西奥德若特”。 – MSpreij 2009-07-30 19:06:13