使用preg_replace大写每个单词的第一个字母

时间:2013-08-13 06:56:09

标签: php regex pcre

所以我将一些句子插入到具有一些自动校正过程的数据库中。以下句子:

$sentence = "Is this dog your's because it can't be mine";

以下代码将每个单词大写,但要确保它不会将收缩大写(例如,n&#t; t):

str_replace(
    "'S", "'s", preg_replace(
       "/(\w+)n'T?/", "$1n't", (
           preg_replace(
              "/\b[a-z]/e", 
              'strtoupper("$0")', 
              ucwords($sentence)
           )
       )
   )
);

回音时,结果如下:

Is This Dog Your's Because It Can't Be Mine

这就是我想要它做的事情,然而,它输入我的MySQL数据库的是:

Is This Dog Your's Because It Can'T Be Mine

我不知道为什么会发生这种情况......我假设我把某些东西搞砸了。

2 个答案:

答案 0 :(得分:7)

您当然应该使用ucwords(),但这是使用正则表达式执行此操作的方法:

echo preg_replace_callback('/(?<=\s|^)[a-z]/', function($match) {
    return strtoupper($match[0]);
}, $sentence);

在更改为大写之前,通过使用lookbehind assertion确保每个小写字符前面都有一个空格(或句子的开头)。

答案 1 :(得分:3)

您可能正在寻找ucwordsDemo):

$sentence = "Is this dog your's because it can't be mine";

echo ucwords($sentence); # Prints "Is This Dog Your's Because It Can't Be Mine"