Php 有人知道修复名称案例的优雅功能吗?
101幼儿园教导我们中的一些人:“你名字中的字母应该是小写的,以大写字母开头。”然而,在这个后识字时代,人们如何以网络形式输入他们的名字似乎取决于他们的情绪、太阳耀斑或诸如此类的东西:全大写、全小写、混合、颠倒 哲学上,我说什么都行!记住你的名字,谁在乎呢。但我的强迫症患者更喜欢看到数据规范化、标准化、可预测。所以我想问你们,你们是否见过任何经过深思熟虑的PHP函数来修复大小写名称,这些函数考虑了Php 有人知道修复名称案例的优雅功能吗?,php,Php,101幼儿园教导我们中的一些人:“你名字中的字母应该是小写的,以大写字母开头。”然而,在这个后识字时代,人们如何以网络形式输入他们的名字似乎取决于他们的情绪、太阳耀斑或诸如此类的东西:全大写、全小写、混合、颠倒 哲学上,我说什么都行!记住你的名字,谁在乎呢。但我的强迫症患者更喜欢看到数据规范化、标准化、可预测。所以我想问你们,你们是否见过任何经过深思熟虑的PHP函数来修复大小写名称,这些函数考虑了ucwords()会彻底破坏的各种异常,例如: 斯文·亚历克斯·克鲁佩特 罗纳尔多麦当劳 布普西奥
ucwords()
会彻底破坏的各种异常,例如:
- 斯文·亚历克斯·克鲁佩特
- 罗纳尔多麦当劳
- 布普西奥布莱恩酒店
- J.R.鲍勃·多布斯
- 弗朗西斯卡·德洛斯加托斯
- 李永成
罗宾五世。根据范塔吉的观点,不可能有任何脚本来统领所有人。但我认为完全用小写或大写输入的名字很可能是一个很好的擦洗。所以对于这些,我会
if ($name == strtoupper($name) || $name == strtolower($name)) {
$name = ucwords(strtolower($name));
}
修改它以修复一些可能的例外情况是很容易的:破折号、撇号、“McD”等。会出现错误,但谁会抱怨呢?不是那个用小写字母输入名字的温顺混蛋
哦,等等,我的名字是小写的…这根本不可能 正如你在问题中所展示的,名字的拼写因国家而异。最简单的方法是找到最常见的拼写方法,即每个“单词”的第一个字母大写,即每个字符串前面都有空格、连字符、点或撇号 这并不能解决你所有的问题(永成、麦当劳),也会给你留下其他问题,但这是你能得到的 比较:
- 亚历克斯·范·海伦(美国拼写)
- Alex van Halen(正确的荷兰语拼写)
$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>';
要“纠正”像容城这样的名字,如果没有考虑到地区/文化习俗的算法和一个庞大的名称数据库进行比较,是不可能的。我找到了一个像样的库来处理用python编写的不同格式的人名,名为。它仍然不能处理上面列出的所有名称,但是使用一些名称,您可能可以接近 我还写了一篇短文,描述了如何从终端获取nameparser库。也许它会帮助别人 以下是基本的python脚本:
然而,这是一个相当古老的问题:
这对永成不起作用,但对其他任何事情都会起作用。唯一的问题是如果
$string
只是一个类似“do Carmo”的姓,那么它将返回“do Carmo”。它是为全名而构建的,如果您$string=“frederick do carmo”代码>然后返回“Frederick do Carmo”。希望这能有所帮助。说得好,我没有考虑到货车/货车的纠纷。我想一个解决方案是检查输入的名称是否完全是大写或小写,然后通过一些函数运行名称。是的,你注意到我用户名中的“v”了吗?如果有什么人或事把它写在上面,我会很讨厌的。只是感觉不对劲。你确实可以扩展你的逻辑,看看是否有人输入了任何大写字母,并据此采取行动。(或者告诉你的客户,这是不可能的,而且人工修复可能更便宜。)试图容纳字母表叛逆者并非不可能,这就是问题所在!!向上投票你的问题只是为了J.R.鲍勃·多布斯。这个问题是关于PHP的,但你的答案是关于Python的。
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
)
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
})
function titleCase($string, $delimiters = array(" ", "-", ".", "'", "O'", "Mc", "Mac"), $exceptions = array("and", "to", "of", "das", "dos", "de", "do", "da", "los", "von", "van", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X")) {
/*
* Exceptions in lower case are words you don't want converted
* Exceptions all in upper case are any words you don't want converted to title case
* but should be converted to upper case, e.g.:
* king henry viii or king henry Viii should be King Henry VIII
*/
$string = mb_convert_case($string, MB_CASE_TITLE, "UTF-8");
foreach ($delimiters as $dlnr => $delimiter) {
$words = explode($delimiter, $string);
$newwords = array();
foreach ($words as $wordnr => $word) {
if (in_array(mb_strtoupper($word, "UTF-8"), $exceptions)) {
// check exceptions list for any words that should be in upper case
$word = mb_strtoupper($word, "UTF-8");
} else if (in_array(mb_strtolower($word, "UTF-8"), $exceptions)) {
// check exceptions list for any words that should be in lower case
$word = mb_strtolower($word, "UTF-8");
} else if (!in_array($word, $exceptions)) {
// convert to uppercase (non-utf8 only)
$word = ucfirst($word);
}
array_push($newwords, $word);
}
$string = join($delimiter, $newwords);
} //foreach
return $string;
}