Эта задача может быть выполнена без использования групп захвата - просто используйте ucfirst()
.
Она не предназначена для обработки многобайтовых символов.
Захватите символ слова, а затем, при необходимости,следующий персонажИз совпадения полной строки измените регистр только первого символа.
Код: ( Демонстрация )
$strings = [
"test string",
"lado lomidze needs a solution",
"I made some research and found 'good' answers here; they really helped me."
]; // if not already all lowercase, use strtolower()
var_export(preg_replace_callback('/\w.?/', function ($m) { return ucfirst($m[0]); }, $strings));
Выход:
array (
0 => 'TeSt StRiNg',
1 => 'LaDo LoMiDzE NeEdS A SoLuTiOn',
2 => 'I MaDe SoMe ReSeArCh AnD FoUnD \'GoOd\' AnSwErS HeRe; ThEy ReAlLy HeLpEd Me.',
)
Для других исследователей, если вы (проще говоря) просто хотите преобразовать все остальные символы в верхний регистр, вы могли бы использовать /..?/
в своем шаблоне, но использование регулярных выражений для этого случая было бы излишним.Вы могли бы более эффективно использовать цикл for()
и двойное приращение.
Код ( Демо )
$string = "test string";
for ($i = 0, $len = strlen($string); $i < $len; $i += 2) {
$string[$i] = strtoupper($string[$i]);
}
echo $string;
// TeSt sTrInG
// ^-^-^-^-^-^-- strtoupper() was called here