3

可能重复:
编程中人名的大写

我注意到在我的网站上注册的人非常懒惰,他们甚至不费心将自己的名字大写。

我的网站是一个面向商业的网站,所以这里没有“自我表达自由”的说法。

名字大写非常容易,因为我想不出一个西方名字不会以大写字母开头的例子。我可能是错的。

但是将姓氏大写变得更加困难,例如

O'Brien
O´Flaherty
de Wit
McKenzie
Auditore da Firenze
de los Remedios de Escalada
Virta-Jokela

什么是在 PHP 中正确自动大写姓氏的好解决方案,它可以在大约 95% 的时间内正确处理?我知道这一点

4

3 回答 3

4

这是一个快速而肮脏的解决方案:

  1. 将字符串拆分为由空格和破折号分隔的单词
  2. 对于每个单词:
    • 如果它在固定的停用词列表中(“de”、“los”等),请不要修改。
    • 如果没有,请检查它是否在固定列表中具有前缀(此列表将包含诸如“O”、“Mc”等内容)。如果存在这样的前缀,则对其进行规范化(例如翻译O"O')并考虑没有前缀的单词进入下一步。
    • 大写单词的第一个字母。
于 2012-05-14T09:28:47.680 回答
1

起初,这似乎很容易:只需将您在姓氏中遇到的每个单词大写即可。所以foo bar会变成Foo Bar

但是,正如您已经指出的那样,也有例外:

  • 德维特
  • 奥迪托雷·达·佛罗伦萨
  • 德洛斯雷梅迪奥斯

这可以通过您不想大写的片段黑名单来解决(在此示例中为“de”、“da”、“de los”)。但是你错误地假设'De','Da'和'De Los'不作为应该大写的(部分)姓氏存在。

所以干脆说:不行,这也做不好,只能半信半疑。

于 2012-05-14T09:33:07.373 回答
-1

它使每个字母的第一个字符大写$name = ucwords(strtolower($name));

对于 95% 以上的情况,这将是准确的。

不清楚,你想怎么样de los Remedios de Escalada?有了上面的表达式,它就会变成De Los Remedios De Escalada。我不确定是否需要。

另一种方法是用“”来爆炸名称,并使 Last word 的第一个字符大写使用ucword()

于 2012-05-14T09:35:48.260 回答