没有正则表达式的句子案例

时间:2012-02-21 18:14:07

标签: php string

是否有内置的php函数或简单(高效!)的方法来组合内置函数,给出一个字符串句子(“Sentence one.Sentence two。”)?

PHP有类似的内置函数,但我找不到任何我的目的:

ucfirst(strtolower("SENTENCE ONE. AND HERE'S TWO."))返回“一句话。这是两个。”; ucwords(strtolower("SENTENCE ONE. AND HERE'S TWO."))“一句话。这是两个。”

5 个答案:

答案 0 :(得分:2)

你可以将字符串拆分为“。”,然后ucfirst每个句子。不是最优雅的解决方案,但它确实有效。

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

答案 1 :(得分:2)

试试这个:

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 :(得分:2)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

不仅可以使用空格,还可以使用新的换行符。

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