Как загладить первую букву первого слова в предложении?

Я пытаюсь написать функцию для очистки ввода пользователя.

Я не пытаюсь сделать это совершенным. Я предпочел бы иметь несколько имен и сокращений в нижнем регистре, чем полный абзац в верхнем регистре.

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

Если следующие выражения сопровождаются буквой, я хочу сделать эту букву в верхнем регистре.

"." ". " (followed by a space) "!" "! " (followed by a space) "?" "? " (followed by a space) 

Еще лучше, функция может добавить пробел после «.», «!» а также "?" если за ними следует письмо.

Как это можно достичь?

 $output = preg_replace('/([.!?])\s*(\w)/e', "strtoupper('\\1 \\2')", ucfirst(strtolower($input))); 

Поскольку модификатор e устарел в PHP 5.5.0:

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

Вот код, который делает так, как вы хотели:

 <?php $str = "paste your code! below. codepad will run it. are you sure?ok"; //first we make everything lowercase, and //then make the first letter if the entire string capitalized $str = ucfirst(strtolower($str)); //now capitalize every letter after a . ? and ! followed by space $str = preg_replace_callback('/[.!?] .*?\w/', create_function('$matches', 'return strtoupper($matches[0]);'), $str); //print the result echo $str . "\n"; ?> 

OUTPUT: Paste your code! Below. Codepad will run it. Are you sure?ok Paste your code! Below. Codepad will run it. Are you sure?ok

 $output = preg_replace('/([\.!\?]\s?\w)/e', "strtoupper('$1')", $input) 

Эта:

 <? $text = "abc. def! ghi? jkl.\n"; print $text; $text = preg_replace("/([.!?]\s*\w)/e", "strtoupper('$1')", $text); print $text; ?> Output: abc. def! ghi? jkl. abc. Def! Ghi? Jkl. 

Обратите внимание, что вам не нужно бежать.!? внутри [].

Разделите строку в массивы, используя ./!/? как делиметр. ucfirst(strtolower($currentString)) каждую строку и используйте ucfirst(strtolower($currentString)) , а затем снова присоедините их к одной строке.

Как насчет этого? Без регулярного выражения.

 $letters = array( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' ); foreach ($letters as $letter) { $string = str_replace('. ' . $letter, '. ' . ucwords($letter), $string); $string = str_replace('? ' . $letter, '? ' . ucwords($letter), $string); $string = str_replace('! ' . $letter, '! ' . ucwords($letter), $string); } 

Работала хорошо для меня.