Подтвердить что ты не робот

Кто-нибудь знает элегантную функцию для исправления имен?

Детский сад 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" и т.д. Ошибки будут сделаны, но кто будет жаловаться? Не кроткий ублюдок, который ввел свое имя в нижнем регистре.

О, подождите, мое имя в нижнем регистре...

4b9b3361

Ответ 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
})