使所有句子的第一个字符大写

时间:2016-02-29 03:06:34

标签: php regex ucfirst

我有一个函数,假设所有句子的第一个字符都是大写的,但由于某种原因,它没有将它作为第一个句子的第一个字符。为什么会发生这种情况,我该如何解决?

<?php

function ucAll($str) {

$str = preg_replace_callback('/([.!?])\s*(\w)/', 
create_function('$matches', 'return strtoupper($matches[0]);'), $str);
return $str;

} //end of function ucAll($str)

$str = ucAll("first.second.third");
echo $str;

?>

结果:

first.Second.Third

预期结果:

First.Second.Third

5 个答案:

答案 0 :(得分:1)

它没有大写第一个单词,因为正则表达式要求前面有.!?之一。第一个单词在其前面没有其中一个字符。

这样就可以了:

function ucAll($str) {
    return preg_replace_callback('/(?<=^|[\.\?!])[^\.]/', function ($match) {
        return strtoupper($match[0]);
    }, $str);
}

它使用正面的后视来确保.!?或行的开头之一位于匹配字符串的前面。< / p>

答案 1 :(得分:0)

试试这个

function ucAll($str) {

$str = preg_replace_callback('/([.!?])\s*(\w)|^(\w)/', 
create_function('$matches', 'return strtoupper($matches[0]);'), $str);
return $str;

} //end of function ucAll($str)

$str = ucAll("first.second.third");
echo $str;

|^(\w)是&#34;或者获得第一个字符&#34;

答案 2 :(得分:0)

这样的事情:

    function ucAll($str) {
            $result = preg_replace_callback('/([.!?])\s*(\w)/',function($matches) {
            return strtoupper($matches[1] . ' ' . $matches[2]);
            }, ucfirst(strtolower($str)));
             return $result;

            } //end of function ucAll($str)
$str = ucAll("first.second.third");
echo $str;

输出

  

首先。第二。第三

答案 3 :(得分:0)

这种情况正在发生,因为您的正则表达式仅匹配定义的标点符号集之后的字符,并且第一个单词不会跟随其中一个。我建议做出这些改变:

首先,此组([?!.]|^)匹配字符串的开头(^)以及您尝试替换的(可选)空格和单词字符之前的标点符号列表。以这种方式进行设置意味着如果字符串的开头有任何空格,它仍然可以工作。

其次,如果您使用的是PHP&gt; = 5.3,那么使用匿名函数而不是create_function,您希望此时(如果您不是,只需更改正则表达式)你的功能应该仍然有用。)

function ucAll($str) {
    return preg_replace_callback('/([?!.]|^)\s*\w/', function($x) {
        return strtoupper($x[0]);
    }, $str);
}

答案 4 :(得分:0)

我已更新您的正则表达式并使用ucwords代替strtoupper,如

function ucAll($str) {
    return preg_replace_callback('/(\w+)(?!=[.?!])/', function($m){
        return ucwords($m[0]);
    }, $str);
}
$str = ucAll("first.second.third");
echo $str;