Кто-нибудь знает элегантную функцию для исправления имен?
Детский сад 101 учит некоторых из нас, что: "Буквы от вашего имени должны быть строчными, с прописными буквами первой буквы". Однако в эту эпоху после грамотности, как люди вводят свои имена в веб-формах, похоже, зависит от их настроения, солнечных вспышек или чего-то еще: Все прописные, все строчные, смешанные, перевернутые...
Философски, я говорю все! Занимай свое имя, кто заботится. Но у меня есть клиенты OCD, которые предпочитают видеть нормализованные данные, стандартизированные, предсказуемые. Поэтому я прошу вас, ребята, если вы видели какие-либо хорошо продуманные PHP-функции для имен для исправления ошибок, которые учитывают различные исключения, которые ucwords()
будут полностью мясником, например:
- Sven-Alex Crumpet
- Роналду Макдональдо
- Boopsie O'Brien
- J.R. Боб Доббс
- Франческа де лос Гатос
- YungCheng Li
Любые функции, которые пытаются разместить этих повстанцев алфавита?
UPDATE
Из точки зрения Робин против Г., не может быть script, чтобы править ими всеми. Но я решил, что имена, введенные полностью в нижнем или верхнем регистре, являются вероятными кандидатами на хорошую чистку. Поэтому для них я сделаю...
if ($name == strtoupper($name) || $name == strtolower($name)) {
$name = ucwords(strtolower($name));
}
Было бы легко изменить это, чтобы исправить несколько вероятных исключений: тире, апострофы, "McD" и т.д. Ошибки будут сделаны, но кто будет жаловаться? Не кроткий ублюдок, который ввел свое имя в нижнем регистре.
О, подождите, мое имя в нижнем регистре...
Ответы
Ответ 1
Это просто невозможно.
Правописание имен варьируется от страны к стране, как вы видите в своем вопросе. Самый простой способ - найти наиболее распространенный способ написания, и это должно было бы загладить каждую первую букву каждого слова, т.е. Каждая строка, которой предшествует пробел, дефис, точка или апостроф.
Это не устраняет все ваши проблемы (YungCheng, McDonaldo) и оставляет вас и с другими проблемами, но так близко, как вы собираетесь.
Для сравнения:
- Алекс Ван Хален (правописание США)
- Алекс ван Хален (правильное голландское правописание)
Нет алгоритма, фиксирующего это.
Эта статья хорошо иллюстрирует проблему с голландскими именами, и это всего лишь один язык. Там, вероятно, есть такая статья для каждого языка в мире.;)
Ответ 2
Вот пример
$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, без алгоритмов, заботящихся о региональных/культурных соглашениях и огромной базе данных имен для сравнения.
Ответ 3
Я нашел приличную библиотеку для обработки различных человеческих имен в разных форматах, написанных на python под названием nameparser. Он по-прежнему не обрабатывает все имена, перечисленные выше, но с некоторыми конфигурацией вы можете приблизиться.
Я также написал короткий blog, в котором описывается, как получить библиотеку имениparerer, работающую с терминалом. Может быть, это поможет кому-то.
Вот базовый питон script:
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
})