PHP句子案例功能

时间:2011-11-23 06:54:14

标签: php

我有一个Google的功能,可以在句子中清理我的段落。

  1. 我想修改此函数,以便将超过2个新行字符转换为换行符。否则它会转换空间中的所有新行字符。所以我会用段落格式。在这里,它将所有新行字符转换为空格。

  2. 正在转换成适当的句子。但是,如果我发现单个单词有第一个单词作为大写,那么我需要函数来忽略它。有时,如果有任何名词,它需要是资本。我们无法改变它的小案例。否则,如果是名词,并且除了第一个字符之外它有超过2个大写字符而不是将其转换为小写字母。

  3. 喜欢 - > Noun => NounNoUn => noun。我希望如果不是第一个字符是资本而不是将它转换为两个小写,那么它保持相同的格式。

    function sentence_case($string) {
    $sentences = preg_split('/([.?!]+)/', $string, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
    $new_string = '';
    foreach ($sentences as $key => $sentence) {
        $new_string .= ($key & 1) == 0?
            ucfirst(strtolower(trim($sentence))) :
            $sentence.' ';
    }
    $new_string = preg_replace("/\bi\b/", "I", $new_string);
    //$new_string = preg_replace("/\bi\'\b/", "I'", $new_string);
    $new_string = clean_spaces($new_string);
    $new_string = m_r_e_s($new_string);
    return trim($new_string);
    }
    

2 个答案:

答案 0 :(得分: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;
}

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

答案 1 :(得分:0)

这应该这样做:

function sentence_case($string) {
// Protect the paragraphs and the caps
$parDelim = "/(\n+\r?)/";
$string = preg_replace($parDelim, "#PAR#", $string);
$string = preg_replace("/\b([A-Z])/", "#$1#", $string);

$sentences = preg_split('/([.?!]+)/', $string, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
$new_string = '';
foreach ($sentences as $key => $sentence) {
    $new_string .= ($key & 1) == 0?
        ucfirst(strtolower(trim($sentence))) :
        $sentence.' ';
}
$new_string = preg_replace("/\bi\b/", "I", $new_string);
//$new_string = preg_replace("/\bi\'\b/", "I'", $new_string);
$new_string = clean_spaces($new_string);
$new_string = m_r_e_s($new_string);

// Restore the paragraphs and the caps
$new_string = preg_replace("#PAR#", PHP_EOL, $new_string);
$new_string = preg_replace("/#([A-Z])#/", "$1", $new_string);
return trim($new_string);
}

它的工作原理是识别您要保护的项目(段落和第一个上限)并用一个字符串标记,然后您可以在完成后将其替换回来。假设您在字符串中没有#PAR#和#A-Z#。如果要强制某种类型的行结尾或其间有多行,则可以使用之后要用于段落分隔符的任何内容。