示例输入:SMK SUNGAI PUNAI
我的代码:
$school = 'SMK SUNGAI PUNAI';
echo ucwords(strtolower($school));
不需要的输出:Smk Sungai Punai
问题
如何使输出 SMK Sungai Punai
保持SMK
全大写。
更新。
问题我有 10,000 个学校名称的列表。从PDF,我转换为mysql。我从 PDF 中准确复制了学校的名称——全部大写。
如何实现有条件的标题大小写?
示例输入:SMK SUNGAI PUNAI
我的代码:
$school = 'SMK SUNGAI PUNAI';
echo ucwords(strtolower($school));
不需要的输出:Smk Sungai Punai
问题
如何使输出 SMK Sungai Punai
保持SMK
全大写。
更新。
问题我有 10,000 个学校名称的列表。从PDF,我转换为mysql。我从 PDF 中准确复制了学校的名称——全部大写。
如何实现有条件的标题大小写?
据我了解,您希望所有学校名称的每个单词的第一个字符都大写,并从此处理中排除一些特殊单词(我的示例中的 $exceptions)。
你可以这样做:
function createSchoolName($school) {
$exceptions = array('SMK', 'PTS', 'SBP');
$result = "";
$words = explode(" ", $school);
foreach ($words as $word) {
if (in_array($word, $exceptions))
$result .= " ".$word;
else
$result .= " ".strtolower($word);
}
return trim(ucwords($result));
}
echo createSchoolName('SMK SUNGAI PUNAI');
此示例将SMK Sungai Punai
根据您的问题返回。
没有真正好的方法可以做到这一点。在这种情况下,您可以假设它是一个缩写,因为它只有三个字母长并且不包含元音。您可以编写一组规则来查找字符串中的缩写,然后将它们大写,但在某些情况下这是不可能的……考虑“BOB PLAYS TOO MUCH WOW”。
您可以非常简单地创建一组以点分隔的排除单词/首字母缩略词,然后使用它(*SKIP)(*FAIL)
来防止匹配整个单词。
mb_convert_case()
是一个很好的调用函数,因为它立即提供 TitleCasing 并且它是多字节安全的。
代码:(演示)
$pipedExclusions = 'SMK|USA|AUS';
echo preg_replace_callback(
'~\b(?:(?:' . $pipedExclusions . ')(*SKIP)(*FAIL)|\p{Lu}+)\b~u',
function($m) {
return mb_convert_case($m[0], MB_CASE_TITLE);
},
'SMK SUNGAI PUNAI'
);
// SMK Sungai Punai
你可以使用这样的东西:
<?php
$str = 'SMK SUNGAI PUNAI';
$str = strtolower($str);
$arr = explode(" ", $str);
$new_str = strtoupper($arr[0]). ' ' .ucfirst($arr[1]). ' ' .ucfirst($arr[2]);
echo '<p>'.$new_str.'</p>';
// Result: SMK Sungai Punai
?>