Разделить имя и фамилию на имя и фамилию - PullRequest
0 голосов
/ 01 сентября 2011

это продолжение Регулярного выражения Javascript для попытки разбить имя на Заголовок / Имя (и) / Фамилия

У меня есть имя и фамилия в моей базе данных, и пользователь можетвведите его полное имя в соответствии с дизайном.Это единственное поле ввода, где он может ввести имя в любом формате, например

  • Dr.Джеймс Уотсон
  • Холмистый Билли
  • Сэр Лоренцо фон Маттерхорн

и т. Д.

Теперь вопрос в том, 1. Как мгновенно подтвердить имярегулярное выражение?2. Как обработать это в first_name и last_name.Я могу использовать JS или PHP

. Существует ли какой-либо конкретный набор правил, изложенных для этой цели?

Ответы [ 3 ]

4 голосов
/ 01 сентября 2011

Нет международного стандарта в именовании людей. Но, может быть, у северокорейцев есть один:

Kim + level of devotion to the leader.

Люди могут иметь несколько имен и даже несколько фамилий.

Порядок имен может отличаться даже в одной и той же культуре: http://en.wikipedia.org/wiki/Chinese_name (западные китайцы меняются местами первыми и последними в соответствии с английским соглашением).

Есть официальные адреса, такие как мистер или сэр.

Существуют академические звания в неограниченном сочетании: проф., Д-р, ..., http://en.wikipedia.org/wiki/Title#Academic_titles

Могут быть суффиксы поколения (младший, старший): http://en.wikipedia.org/wiki/Junior_%28suffix%29#Generational_titles

Самое большое в мире имя:

Адольф Блейн Чарльз Дэвид Эрл Фредерик Джеральд Юбер Ирвин Джон Кеннет Ллойд Мартин Неро Оливер Пол Куинси Рэндольф Шерман Томас Ункас Виктор Уильям Ксеркс Янси Зевс Wolfeschlegelsteinhausenbergerdorffvoralternwarengewissenhaftschaferswessenschafewarenwohlgepflegeundsorgfaltigkeitbeschutzenvonangreifendurchihrraubgierigfeindewelchevoralternzwolftausendjahresvorandieerscheinenwanderersteerdemenschderraumschiffgebrauchlichtalsseinursprungvonkraftgestartseinlangefahrthinzwischensternartigraumaufdersuchenachdiesternwelchegehabtbewohnbarplanetenkreisedrehensichundwohinderneurassevonverstandigmenschlichkeitkonntefortplanzenundsicherfreuenanlebenslanglichfreudeundruhemitnichteinfurchtvorangreifenvonandererintelligentgeschopfsvonhinzwischensternartigraumen, Старший.

Если ваше поле ввода ограничено максимальным числом символов, не беспокойтесь, у этого человека, к счастью, короткое имя:

Вольф + 585, Старший

В этом случае вы не должны допустить, чтобы + и 585 были действительными именами.

http://en.wikipedia.org/wiki/Wolfe%2B585,_Senior

1 голос
/ 01 сентября 2011

Звучит как домашнее задание.Кажется сомнительным в общем случае.См. http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/

В большинстве веб-форм есть место для имени, фамилии и т. Д. Если бы это было легко, они бы этого не сделали.

Йода говорит: вызовите регулярное выражение !?Спускайся ты в ад особых случаев.Остановитесь, пока не стало слишком поздно.

Доктор Джон Смит

Джон Смит, доктор философии

Джон Смит, доктор медицины

Доктор Джон Смит, доктор медицины

Король Джеймс VI

Джеймс VI, Король Бла-Бла-Бла, Защитник Веры

Публий Корнелиус Сципион Африканский

Папа Бенедикт

Бенедикт Арнольд

Джим Папа

Сестра Тереза ​​

Мать Тереза ​​

Мать! @ # $% ^

Витая сестра

Преподобный д-р Мартин Лютер Кинг-младший

Преподобный д-р Мартин Лютер Кинг-младший

д-р Мартин Лютер Кинг, младший

Президент Джордж Буш

Ш

Мальчик Джордж

0 голосов
/ 01 сентября 2011

Это сложная проблема, не имеющая универсального решения - как отмечали другие.Вероятно, лучший подход - позволить пользователю вводить заголовок, имя и фамилию по отдельности.Однако, если вам действительно нужно выполнить синтаксический анализ, есть несколько простых решений, которые могут работать, по крайней мере, для наиболее распространенных форматов имен.Вот один пример:

$name = "Dr. James Watson";

// Define the set of allowed titles
$titles = 'dr|dr\.|prof|prof\.|sir';

// If the name is composed of two words separated by a space, assume this is
// first and last name
if (preg_match('/^([[:alpha:]]+) ([[:alpha:]]+)$/', $name, $matches)) {
    $first_name = $matches[1];
    $last_name = $matches[2];
}
// If there are more than two parts, check if the first part is the title
elseif (preg_match('/^(' . $titles . ')? ?([[:alpha:]]+) ([[:alpha:] ]+)$/i', $name, $matches)) {
    $prefix = $matches[1];
    $first_name = $matches[2];
    $last_name = $matches[3];
}
else {
    // Name cannot be parsed
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...