Приговор без регулярных выражений - PullRequest
2 голосов
/ 21 февраля 2012

Существует ли встроенная функция php или простой (эффективный!) Способ объединения встроенных функций, чтобы получить строковое предложение («Предложение одно. Предложение два.»)?

PHP имеет аналогичные встроенные функции, но ни одной, которую я могу найти для своих целей:

ucfirst(strtolower("SENTENCE ONE. AND HERE'S TWO.")) возвращает «Предложение одно. А вот и два.»;ucwords(strtolower("SENTENCE ONE. AND HERE'S TWO.")) «Приговор первый. А вот и два».

Ответы [ 5 ]

2 голосов
/ 05 апреля 2012
function sentence_case($str) {
   $cap = true;
   $ret='';
   for($x = 0; $x < strlen($str); $x++){
       $letter = substr($str, $x, 1);
       if($letter == "." || $letter == "!" || $letter == "?"){
           $cap = true;
       }elseif($letter != " " && $cap == true){
           $letter = strtoupper($letter);
           $cap = false;
       } 
       $ret .= $letter;
   }
   return $ret;
}

Это сохранит существующие собственные имена, сокращения и сокращения.

2 голосов
/ 21 февраля 2012

Попробуйте это:

function sentenceCase($s){
    $str = strtolower($s);
    $cap = true;

    for($x = 0; $x < strlen($str); $x++){
        $letter = substr($str, $x, 1);
        if($letter == "." || $letter == "!" || $letter == "?"){
            $cap = true;
        }elseif($letter != " " && $cap == true){
            $letter = strtoupper($letter);
            $cap = false;
        }

        $ret .= $letter;
    }

    return $ret;
}

Взято из php.net Работает не только с периодами в качестве окончания строки.

2 голосов
/ 21 февраля 2012

Вы можете разбить строку на ".", А затем сначала каждое предложение. Не самое элегантное решение, но оно работает.

$sentences = explode(".",$paragraph);
$text = "";
foreach($sentences as $sentence) {
   $text .= ucfirst(strtolower($sentence)).".";
}
0 голосов
/ 29 января 2019

Будет работать с новыми переносами строк не только пробелами.

function sentenceCase($text){

    $cap = true; $newText = '';

    for($x = 0; $x < strlen($text); $x++){

        $letter = substr($text, $x, 1);

        if($letter == '.' || $letter == '!' || $letter == '?' || $letter == "\n"){

            $cap = true;

        } elseif($letter != ' ' && $cap == true){

            $letter = strtoupper($letter);
            $cap = false;
        } 

        $newText .= $letter;
    }

    return $newText;
}
0 голосов
/ 21 февраля 2012

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

<?php

$str = "SENTENCE ONE. AND HERE'S TWO.";

$sentences = preg_split('/(\.\s+)/', $str, null, PREG_SPLIT_DELIM_CAPTURE);

array_walk(&$sentences, create_function('&$val', '$val = ucfirst(strtolower($val));')); 

$str = implode('', $sentences);

echo $str;  // Sentence one. And here's two.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...