我非常关心大写(可能太多)。所以我编写了一个函数来修复我网站上的大写。我基本上想要“标题案例”,但有一些例外......我不喜欢看大写和首字母缩略词。
function my_capitals($string)
{
$uc = ucwords($string);
$tokens = explode(' ',$uc);
foreach ($tokens as $key=>$val)
{
if ($val == 'Ipa') $tokens[$key] = 'IPA';
else if ($val == 'Ipas') $tokens[$key] = 'IPAs';
else if ($val == 'Apa') $tokens[$key] = 'APA';
else if ($val == 'Apas') $tokens[$key] = 'APAs';
else if ($val == 'A') $tokens[$key] = 'a';
else if ($val == 'And') $tokens[$key] = 'and';
else if ($val == 'The') $tokens[$key] = 'the';
else if ($val == 'In') $tokens[$key] = 'in';
else if ($val == 'Or') $tokens[$key] = 'or';
else if ($val == 'Of') $tokens[$key] = 'of';
else if ($val == 'To') $tokens[$key] = 'to';
else if ($val == 'On') $tokens[$key] = 'on';
else if ($val == 'At') $tokens[$key] = 'at';
else $tokens[$key] = $val;
}
$final = implode(' ',$tokens);
return $final;
}
想象一下,可能还有另外10-15个选项,每页可以在相对较短的字符串上运行3-5次(单行描述和标题)。
我的问题是:这是完成此类翻译的有效方法吗?或者我应该找出一种更有效的方法吗?还有另一种我不知道的替代方案,而不仅仅是可能具有相似性能的开关吗?
答案 0 :(得分:2)
首先,您必须考虑高效对您意味着什么。你在找
吗?其次,鉴于你的详细信息......
...除非您在脚本中使用烤面包机,否则执行时间和系统影响都不会给您带来任何麻烦。
实际上,这取决于干净的代码。因此,您应该了解==
和===
的区别。
接下来,您已经有一个字符串可以搜索多个字符串特定函数:$uc
。
那么str_replace呢?它接受数组作为输入。
function my_capitals($string)
{
$uc = " ".ucwords($string)." ";
$search = [' Ipa ', ' Ipas ', ' A ', ' Bändy '];
$replacements = [' IPA ', ' IPAs ', ' a ', ' Cändy '];
return ucfirst(trim(str_replace($search, $replacements, $uc)));
}
您甚至可以将其缩短为1行:
function my_capitals($string)
{
return ucfirst(trim(str_replace([' Ipa ', ' Ipas ', ' A ', ' Bändy '], [' IPA ', ' IPAs ', ' a ', ' Cändy '], " ".ucwords($string)." ")));
}
只需确保$search
和$replacements
包含相同数量的元素,并且都包含前导和尾随空格。
只需分配一次数组就可以提高连续调用的速度。
function my_capitals1a($string, $searcher, $replacement)
{
return ucfirst(trim(str_replace($searcher,$replacement, " ".ucwords($string)." ")));
}
演示和速度比较:http://sandbox.onlinephpfunctions.com/code/fd594ab47b78778981dc0a58432e141f48f9b6e7
编辑:单词安全替换 Edit2:速度比较 Edit3:改进了来自@Pogrock的提示
答案 1 :(得分:0)
我会这样做:
function my_capitals($string)
{
$uc = ucwords($string);
$tokens = explode(' ',$uc);
$excepsions = ['Ipa'=>'IPA','Ipas'=>'IPAs'];
foreach ($tokens as $key=>$val)
{
if(isset($excepsions[$val])){
$tokens[$key] = $excepsions[$val];
}
}
$final = implode(' ',$tokens);
return $final;
}
答案 2 :(得分:0)
OP代码略有不同。大写输入标题中的所有单词,然后交换像And for和。最后初始化标题的开头。
你可以先用字符串来标准化你的标题,但这可能会打破像O' Hagan这样的名字。
还有许多其他边缘案例未被涵盖,您可能最好以速度换取全功能库。
Class<TempView>