gpt4 book ai didi

php - 每个单词的首字母大写,冠词、连词和介词除外

转载 作者:行者123 更新时间:2023-12-02 15:38:55 24 4
gpt4 key购买 nike

我正在为使用 Codeigniter 构建的自定义 CMS 编写标签系统,并且我正在尝试强制执行特定格式。

基本上,我需要每个单词的第一个字母大写,但以下单词除外,它应该是小写的:

  • 冠词:a, an, the
  • 并列连词:and、but、or、for、nor 等。
  • 介词(少于五个字母):with、on、at、to、from、by 等。

此外,如果标签以上述之一开头,则应大写。

一些格式正确的标签示例:

  • 权力的游戏
  • 鼠与人
  • 从头到尾
  • 指环王
  • 极品飞车

到目前为止我只有:

$tag = 'Lord of the Rings';
$tag = ucwords($tag);

$patterns = array('/A/', '/An/', '/The/', '/And/', '/Of/', '/But/', '/Or/', '/For/', '/Nor/', '/With/', '/On/', '/At/', '/To/', '/From/', '/By/' );
$lowercase = array('a', 'an', 'the', 'and', 'of', 'but', 'or', 'for', 'nor', 'with', 'on', 'at', 'to', 'from', 'by' );

$formatted_tag = preg_replace($patterns, $lowercase, $tag);

// capitalize first letter of string
$formatted_tag = ucfirst($formatted_tag);

echo $formatted_tag;

这会产生 指环王 的正确结果,但如何避免重复数组?当我添加新词时,将它们匹配起来很乏味。

我确定应该包含一些我遗漏的词,是否有我可以使用的现有函数或类?

最佳答案

如果您将自定义回调与 preg_replace_callback() 一起使用,则不需要 $lowercase 数组.此外,您当前的方法需要字边界,否则它会将 Android 替换为 android 或将 bAnd 替换为 band。最后,为 N 个单词创建 N 个正则表达式效率低下且没有必要,因为这可以用一个正则表达式来完成。

我只保留一个单词数组:

$words = array('A', 'An', 'The', 'And', 'Of', 'But', 'Or', 'For', 'Nor', 'With', 'On', 'At', 'To', 'From', 'By' );

然后创建一个动态正则表达式,完成单词边界,如下所示:

$regex = '/\b(' . implode( '|', $words) . ')\b/i';

现在用小写字母替换所有匹配项:

$formatted_tag = preg_replace_callback( $regex, function( $matches) {
return strtolower( $matches[1]);
}, $tag);

关于php - 每个单词的首字母大写,冠词、连词和介词除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11871017/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com