不带正则表达式的句子大小写


Sentence case without regular expressions

是否有内置的php函数,或者一种简单(高效!)的方法来组合内置函数,以提供字符串句子大小写("句子一。句子二。")?

PHP有类似的内置功能,但我找不到任何适合我的功能:

ucfirst(strtolower("SENTENCE ONE. AND HERE'S TWO."))返回"第一句,这里是第二句";ucwords(strtolower("SENTENCE ONE. AND HERE'S TWO."))"第一句。这是第二句。"

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;
}

这将保留现有的专有名词大写字母、首字母缩写和缩写。

您可以在"."上拆分字符串,然后ucfirst每个句子。不是最优雅的解决方案,但它有效。

$sentences = explode(".",$paragraph);
$text = "";
foreach($sentences as $sentence) {
   $text .= ucfirst(strtolower($sentence)).".";
}

试试这个:

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。它不仅仅使用句点作为行尾。

我使用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.

将使用换行符而不仅仅是空格。

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;
}