是否有内置的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;
}