2012-02-21 5 views
2

내장 된 함수를 결합하는 간단한 (효율적인!) 방법이 내장되어있어 대문자로 묶을 수 있습니다 ("문장 1, 문장 2")?정규식이없는 대소 문자

PHP 비슷한 내장 기능을 가지고,하지만 난 내 목적에 내 그것을 찾을 수 없음 :

ucfirst(strtolower("SENTENCE ONE. AND HERE'S TWO.")) 반환; "문장 하나 여기에 두 가지입니다.." ucwords(strtolower("SENTENCE ONE. AND HERE'S TWO.")) "문장 하나, 여기 두 문장."

+1

이는 단어가 무엇인지 또는 단어의 첫 문자가 무엇인지를 구문 적으로 쉽게 정의 할 수 있기 때문입니다. 실제로 사용 된 언어에 대한 적절한 문법을 ​​사용하지 않고 문장이 무엇인지 정의하는 것은 쉽지 않습니다. 정규 표현식을 사용하는 것이 좋습니다. 그들은 합리적으로 빠르므로 걱정할 필요가 없습니다. – Basti

+1

항상 문자열을 모든 정지 지점에서 배열로 분해하고 모든 배열 항목에서 ucfirst를 실행 한 다음 해당 배열을 함축시킬 수 있습니다. (정말로 Regex를 사용하고 싶지 않다면). – BenOfTheNorth

+0

Basti가 암시하는 문법 난이도를 과소 평가하지 마십시오. 지금까지의 모든 솔루션은 적절한 이름과 머리 글자로 실패합니다. – horatio

답변

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

기존의 고유 명사 대문자, 두문자어 및 축약어가 유지됩니다.

+0

조금 늦은 파티에 :),하지만 이것은 아주 잘 작동합니다! 그것은 대문자로 된 문장을 적절한 경우에 넣지는 않겠지 만 이것은 나의 요구에 가장 가깝기 때문에 나는 그것을 올바른 답으로 표시하고 있습니다. – amindfv

2

문자열을 "."로 분리 한 다음 각 문장을 ucfirst로 나눌 수 있습니다. 가장 우아한 솔루션은 아니지만 작동합니다.

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

문장이 질문이나 느낌표로 끝나는 경우 어떻게됩니까? – j08691

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. 
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 작품에서 촬영.

+0

이것은 내가 찾고 있었던 것이다. 감사. 이것이 내장 함수가 아니라는 것은 이상한 일입니다. – amindfv

+0

약어로 처리하지 않습니다 (예 : 미국을 미국으로 변환 함). – vaichidrewar