这是Javascript正则表达式的延续,试图将名称拆分为标题/名字/姓氏
我有first_name &Last_name在我的数据库和用户可以按设计输入他的全名。这是一个单一的输入字段,他可以输入任何格式的名称例如
- 。詹姆斯沃森
- 丘陵比利
- 洛伦佐·冯·马特洪恩爵士
等。
现在的问题是1. 如何立即验证名称,正则表达式?2. 如何将其处理成first_name和last_name。我可以用JS或PHP
是否为此目的制定了一套特定的规则?
人名的命名没有国际标准。但是,也许朝鲜有一个:
Kim
+ level of devotion to the leader
.
人们可能有多个名字,甚至多个姓氏。
即使在相同的文化中,名字的顺序也可能不同:http://en.wikipedia.org/wiki/Chinese_name(西方中国人为了符合英语惯例而互换名字的首尾)。
有正式的称呼,如先生或先生。
学术头衔可以任意组合:教授、博士、……, http://en.wikipedia.org/wiki/Title Academic_titles
可以有代后缀(Junior, Senior): http://en.wikipedia.org/wiki/Junior_%28suffix%29#Generational_titles
世界上最大的名字是:
阿道夫布莱恩查尔斯大卫伯爵弗雷德里克杰拉尔德休伯特欧文约翰肯尼斯·劳埃德·马丁·尼禄·奥利弗·保罗·昆西·伦道夫·谢尔曼·托马斯维克多·威廉·薛西斯·扬西·宙斯Wolfe-schlegelstein-hausenberger-dorffvoraltern-waren-gewissenhaft-schaferswessen-schafewaren-wohlgepflege-und-sorgfaltigkeit-beschutzen-von-angreifen-durch-ihrraubgierigfeinde-welche-voraltern-zwolftausend-jahres-vorandieerscheinen-wander-ersteer-dem-enschderraumschiff-gebrauchlicht-als-sein-ursprung-von-kraftgestart-sein-lange-fahrt-hinzwischen-sternartigraum-auf-der-suchenach-diestern-welche-gehabt-bewohnbar-planeten-kreise-drehen-sich-und-wohin-der-neurasse-von-verstandigmen-schlichkeit-konnte-fortplanzen-und-sicher-freuen-anlebens-langlich-freude-und-ruhe-mit-nicht-ein-furcht-vor-angreifen-von-anderer-intelligent-geschopfs-von-hinzwischen-sternartigraumen,高级.
如果您的输入字段限制为最大字符数,不用担心,这个人幸运地有一个简短的名字:
沃尔夫+ 585,高级
在这种情况下,您不应该忘记允许+
和585
是有效的名称字符。
听起来像家庭作业。在一般情况下似乎值得怀疑。见http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/
大多数网页表单都有名字、姓氏等的位置。如果很容易,他们就不会那样做了。
Yoda说:调用正则表达式!?你会陷入一堆特殊情况。趁早停止。
约翰·史密斯博士
John Smith, PhD
John Smith, MD
Dr John Smith MD
詹姆斯六世
詹姆斯六世,巴拉巴拉国王,信仰的捍卫者
普布利乌斯·科尼利厄斯·西庇阿
教皇本尼迪克特本尼迪克特·阿诺德
吉姆教皇妹妹特蕾莎
德兰修女
妈妈! @ # $ % ^
扭曲姐妹马丁·路德·金牧师
牧师马丁·路德·金博士
马丁·路德·金博士
乔治·W·布什总统
W乔治男孩
这是一个棘手的问题,没有通用的解决方案——正如其他人指出的那样。最好的方法可能是允许用户分别输入标题、名和姓。但是,如果您确实需要进行解析,那么有一些简单的解决方案可能至少适用于最常见的名称格式。下面是一个例子:
$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
}