2016-02-29 1 views
2

У меня есть функция, которая предполагает, чтобы первый символ всех предложений был прописным, но по какой-то причине он не делает это с первым символом первого предложения. Почему это происходит, и как я могу это исправить?Создание первого символа всех предложений в верхнем регистре

<?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

Попробуйте

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) является "или получить первый символ"

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; 

Выход:

Первое. Во-вторых. Третий

0

Это происходит потому, что ваше регулярное выражение соответствует только символам после определенного набора знаков препинания, а первое слово не соответствует одному из них. Я бы предложил сделать эти изменения:

Во-первых, эта группа ([?!.]|^) соответствует началу строки (^), а также ваш список знаков препинания перед (по желанию) пробелов и символа слова, которые вы пытаетесь заменить. Настройка этого способа означает, что он должен работать, если в начале строки есть пробел.

Во-вторых, используя анонимную функцию вместо create_function является recommended, если вы используете PHP> = 5.3, которые вы, надеемся, в этот момент (если нет, то просто изменить регулярное выражение в функции должно работать.)

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

Это не прописной первое слово, потому что регулярное выражение требует, чтобы было один из ., ! или ? в-перед ним. Первое слово не имеет одного из этих символов перед ним.

Это сделать:

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

Он использует позитивный взгляд-позади, чтобы убедиться, что один из ., !, ?, или начало строки, в-перед совпавшей строки.

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; 
Смежные вопросы