Есть ли у кого-то функция PHP для правильного использования имен людей? - PullRequest
9 голосов
/ 30 июля 2009

Я ищу функцию для правильного использования таких имен, как Макдональд, Фитцджеральд, Макартур, О'Ланни, Тео де Раадт и т. Д.

Кто-нибудь знает о том, что работает резонно хорошо? Я предполагаю, что ни одна функция не будет поддерживать каждую возможность.

Конечно, одни только ucwords не работают для этого, потому что они просто пишут первую букву каждого слова.

Редактировать: Я знаю, что будут проблемы, и все возможности не будут поддерживаться. Но проблема сейчас в том, что у меня есть база данных из примерно 50 000 имен, которые в основном вводятся во всех заглавных буквах, и было бы больно в задницу редактировать каждое из них, не вызывая орфографические ошибки. Наличие сценария, который вызывает проблему с 20%, будет намного быстрее и приведет к гораздо меньшему количеству ошибок.

Ответы [ 3 ]

6 голосов
/ 30 июля 2009

Может быть, вам нужно что-то вроде этого Примечание функции ucwords

3 голосов
/ 30 июля 2009

Вы, вероятно, знаете об этом, но одна огромная проблема, с которой вы столкнетесь, состоит в том, что существует несколько «правильных» заглавных букв некоторых имен - в вашем примере я не согласен с FitzGerald, например.

0 голосов
/ 11 марта 2016

Обычно я использую

$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;
    }

имена, такие как Юрген Мачо (футболист), возвращаются как Юрген Макхо, хотя, как отмечалось в других ответах и ​​комментариях, имена жесткие

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...