Php 有人知道修复名称案例的优雅功能吗?

Php 有人知道修复名称案例的优雅功能吗?,php,Php,101幼儿园教导我们中的一些人:“你名字中的字母应该是小写的,以大写字母开头。”然而,在这个后识字时代,人们如何以网络形式输入他们的名字似乎取决于他们的情绪、太阳耀斑或诸如此类的东西:全大写、全小写、混合、颠倒 哲学上,我说什么都行!记住你的名字,谁在乎呢。但我的强迫症患者更喜欢看到数据规范化、标准化、可预测。所以我想问你们,你们是否见过任何经过深思熟虑的PHP函数来修复大小写名称,这些函数考虑了ucwords()会彻底破坏的各种异常,例如: 斯文·亚历克斯·克鲁佩特 罗纳尔多麦当劳 布普西奥

101幼儿园教导我们中的一些人:“你名字中的字母应该是小写的,以大写字母开头。”然而,在这个后识字时代,人们如何以网络形式输入他们的名字似乎取决于他们的情绪、太阳耀斑或诸如此类的东西:全大写、全小写、混合、颠倒

哲学上,我说什么都行!记住你的名字,谁在乎呢。但我的强迫症患者更喜欢看到数据规范化、标准化、可预测。所以我想问你们,你们是否见过任何经过深思熟虑的PHP函数来修复大小写名称,这些函数考虑了
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;
}