3

示例输入:SMK SUNGAI PUNAI

我的代码:

$school = 'SMK SUNGAI PUNAI';
echo ucwords(strtolower($school));

不需要的输出:Smk Sungai Punai

问题

如何使输出 SMK Sungai Punai保持SMK全大写。

更新。

问题我有 10,000 个学校名称的列表。从PDF,我转换为mysql。我从 PDF 中准确复制了学校的名称——全部大写。

如何实现有条件的标题大小写?

4

4 回答 4

3

据我了解,您希望所有学校名称的每个单词的第一个字符都大写,并从此处理中排除一些特殊单词(我的示例中的 $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根据您的问题返回。

于 2010-07-14T20:19:57.267 回答
1

没有真正好的方法可以做到这一点。在这种情况下,您可以假设它是一个缩写,因为它只有三个字母长并且不包含元音。您可以编写一组规则来查找字符串中的缩写,然后将它们大写,但在某些情况下这是不可能的……考虑“BOB PLAYS TOO MUCH WOW”。

于 2010-07-14T19:14:26.760 回答
1

您可以非常简单地创建一组以点分隔的排除单词/首字母缩略词,然后使用它(*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
于 2021-08-13T14:57:17.497 回答
-1

你可以使用这样的东西:

<?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
?>
于 2010-07-14T20:25:23.483 回答