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