ucwords with abbreviation exceptions

时间:2011-12-31 17:05:50

标签: php

如何翻译此文:

  

美国与巴基斯坦关系的新低

进入本文:

  

美巴关系的新低

PHP的strtolower(ucwords($string))会将“US-PAKISTAN”变成“Us-pakistan”。但是,我要求巴基斯坦的首字母缩略词“US”和“P”保持大写。我怎样才能最好地实现这一目标?

3 个答案:

答案 0 :(得分:3)

检查PHP ucwords()文档中的注释。它们涵盖了这些连字符和例外问题,并提供了解决方案。

答案 1 :(得分:2)

至于美国:你需要一个存储大写单词的数据库。 PHP本身是愚蠢的,它不知道你是指美国还是我们(指责我们)。因此,口译员无法决定美国 - 巴基斯坦的美国是缩写还是代名词。

使用这样的数据库,您可以正常调用您的上层函数。之后,您必须检查条目是否在您的数据库中,并将文本中的匹配项替换为数据库中的匹配项。

$string = strtolower(ucwords($string));
$words = preg_split('/\s+/', $string);
foreach ($words as $word) {
    // search case-independantly
    if (null !== ($correctForm = searchDatabase($word))) {
        str_replace($word, $correctFrom, $string);
    }
}

这可能不是最佳选择,但我希望如果PHP无法知道某个单词是否是缩写,我可以看到它是什么样的。

在数据库中,您可能有以下条目:

us-pakistan US-Pakistan
us-politician US-politician

或者如果你想实现它甚至有点高级:

us-* US-*

在这种情况下你也可能只用很多preg_replaces()来实现它,但不要问我时间消耗。我想这两个想法都很慢。

至于巴基斯坦:在破灭资本之后保留信件更容易。在调用函数之前,您可以将-替换为-包围空格( [space] - [space] ),然后PHP会认为它们都是单个单词。之后你可以用一个简单的破折号替换 [space] - [space] 构造。

str_replace(' - ', '-', strtolower(ucwords(str_replace('-', ' - ', $string))));

查看Ayman Safadi发布的PHP评论,我猜他们有更好的解决方案来处理这个问题(我只是说:“我想到的第一个最短的解决方案是什么?”)。

答案 2 :(得分:1)

您可以尝试以下代码来实现所需的结果。在此代码中我们首先将整个字符串转换为小写,然后使用ucwords()函数在标题大小写中获取整个字符串然后我们因此使用str_replace来实现特定的输出

<强>代码:

<?php
$a="NEW LOW FOR US-PAKISTAN RELATIONS";
$b=ucwords(strtolower($a));
$c=str_replace("Us-pakistan","US-Pakistan","$b");
echo $c;
?>

<强>输出:

New Low For US-Pakistan Relations