3

我想使用 PHP 通过大写每个单词来清理一些标题,包括斜线后面的那些。但是,我不想将单词“and”、“of”和“the”大写。

下面是两个示例字符串:

会计技术/技术员和簿记

脊柱骨科手术

应更正为:

会计技术/技术员和簿记

脊柱整形外科


这是我目前拥有的。我不确定如何将内爆与 preg_replace_callback 结合起来。

// Will capitalize all words, including those following a slash
$major = implode('/', array_map('ucwords',explode('/',$major)));

// Is supposed to selectively capitalize words in the string
$major = preg_replace_callback("/[a-zA-Z]+/",'ucfirst_some',$major);

function ucfirst_some($match) {
   $exclude = array('and','of','the');
   if ( in_array(strtolower($match[0]),$exclude) ) return $match[0];
   return ucfirst($match[0]);
}

现在它将字符串中的所有单词大写,包括我不想要的单词。

4

2 回答 2

8

好吧,我打算尝试对 进行递归调用ucfirst_some(),但是您的代码在没有第一行的情况下似乎可以正常工作。IE:

<?php
$major = 'accounting technology/technician and bookkeeping';
$major = preg_replace_callback("/[a-zA-Z]+/",'ucfirst_some',$major);
echo ucfirst($major);

function ucfirst_some($match) {
   $exclude = array('and','of','the');
   if ( in_array(strtolower($match[0]),$exclude) ) return $match[0];
   return ucfirst($match[0]);
}

打印所需的Accounting Technology/Technician and Bookkeeping.

您的正则表达式已经匹配字符串,您似乎根本不需要担心斜线。请注意,单词中间的数字或符号 [如连字符] 也会导致大写。

此外,不要理会那些喋喋不休地指责你的$exclude阵列不够完整的人,你总是可以在遇到他们时添加更多的词。或者只是谷歌列表。

应该注意的是,没有单一的、商定的“正确”方式来确定应该/不应该以这种方式大写的内容。

于 2012-12-31T16:22:16.877 回答
1

您还想确保在句子开头使用诸如 an 和 the 之类的词是否都是大写字母。

注意:我想不出任何以 of 或 和 开头的术语,但在奇怪的数据潜入您的程序之前更容易解决此类问题。

我以前在 http://codesnippets.joyent.com/posts/show/716上使用过一个代码片段

它在评论部分 http://php.net/manual/en/function.ucwords.php#84920的 ucwords 的 php.net 功能页面上被引用

于 2012-12-31T16:22:47.340 回答