2012-06-23 3 views
0

나는 PHP에서 일하고 있는데, 주어진 길이와 높이의 텍스트가 주어지면 같은 텍스트의 제한된 버전을 최대 500 자와 10으로 반환하는 함수를 만들고 싶습니다. 윤곽.긴 텍스트의 미리보기

이것은 내가 지금까지 무엇을 가지고 :

function preview($str) 
{ 
    $partialPreview = explode("\n", substr($str, 0, 500)); 
    $partialPreviewHeight = count($partialPreview); 
    $finalPreview = ""; 

    // if it has more than 10 lines 
    if ($partialPreviewHeight > 10) { 
     for ($i = 0; $i < 10; $i++) { 
      $finalPreview .= $partialPreview[$i]; 
     } 
    } else { 
     $finalPreview = substr($str, 0, 500); 
    } 

    return $finalPreview; 
} 

나는 두 가지 질문이 있습니다

  • 새로운 라인 피드를 감지하는 적절한 \n를 사용 있나요? 어떤 시스템은 \n, 다른 \r\n 및 기타 \r을 사용하지만, \n은 가장 공통입니다.
  • 가끔 (따옴표)과 같은 HTML 엔터티가 끝에 있으면 &quot으로 남겨져 유효한 HTML이 아닙니다. 어떻게 이것이 을 막을 수 있습니까?

답변

0

새 줄 바꿈을 감지하는 데 \ n 사용 하시겠습니까? 일부 시스템에서는 \ n, 다른 \ r \ n 및 다른 \ r을 사용하지만 \ n이 가장 일반적이라는 것을 알고 있습니다.

데이터의 출처에 따라 다릅니다. 운영 체제에 따라 줄 바꿈이 다릅니다.

Windows는을 사용하고 * nix (Mac OS 포함)은 \n을 사용하고 오래된 MAC은 \r을 사용합니다. 데이터가 웹 (예 : 텍스트 영역)에서 오는 경우에는 항상 \r\n이됩니다. 그게 뭔데요 the specuser agents should do입니다. 마지막 " (따옴표) 같은 HTML 엔티티가 있는지

때때로, 그것은 & 바와 같이 왼쪽이고, 따라서 유효 HTML 아니다. 이 문제를 어떻게 방지 할 수 있습니까?

텍스트를 자르기 전에 HTML 엔티티를 일반 텍스트로 다시 변환 할 수 있습니다. 필요에 따라 htmlspecialchars_decode() 또는 html_entity_decode을 사용하십시오. 이제 엔티티를 깨뜨리지 않아도됩니다 (필요한 경우 다시 엔코딩하는 것을 잊지 마십시오).

또 다른 옵션은 하드 문자 제한이 아닌 공백 문자에서만 텍스트를 분리하는 것입니다. 이렇게하면 "요약"에 전체 단어 만 표시됩니다.

대부분의 문제를 처리해야하는 클래스를 만들었습니다. 데이터가 텍스트 영역에서 오는 경우 이미 언급 한 바와 같이 항상 \r\n 될 것입니다,하지만 난 다음 (테스트되지 않은) 같은 것을 함께했다 다른 바꿈을 구문 분석 할 수 있도록 :

class Preview 
{ 
    protected $maxCharacters; 
    protected $maxLines; 
    protected $encoding; 
    protected $lineBreaks; 

    public function __construct($maxCharacters = 500, $maxLines = 10, $encoding = 'UTF-8', array $lineBreaks = array("\r\n", "\r", "\n")) 
    { 
     $this->maxCharacters = $maxCharacters; 
     $this->maxLines = $maxLines; 
     $this->encoding = $encoding; 
     $this->lineBreaks = $lineBreaks; 
    } 

    public function makePreview($text) 
    { 
     $text = $this->normalizeLinebreaks($text); 

     // this prevents the breaking of the &quote; etc 
     $text = html_entity_decode($text, ENT_QUOTES, $this->encoding); 

     $text = $this->limitLines($text); 

     if (mb_strlen($text, $this->encoding) > $this->maxCharacters) { 
      $text = $this->limitCharacters($text); 
     } 

     return html_entity_decode($text, ENT_QUOTES, $this->encoding); 
    } 

    protected function normalizeLinebreaks($text) 
    { 
     return str_replace($lineBreaks, "\n", $text); 
    } 

    protected function limitLines($text) 
    { 
     $lines = explode("\n", $text); 
     $limitedLines = array_slice($lines, 0, $this->maxLines); 

     return implode("\n", $limitedLines); 
    } 

    protected function limitCharacters($text) 
    { 
     return substr($text, 0, $this->maxCharacters); 
    } 
} 

$preview = new Preview(); 
echo $preview->makePreview('Some text which will be turned into a preview.'); 
+0

여러분, 매우 완전한 답변을 주셔서 감사합니다. 미리보기 클래스에 대해 많은 것을 감사 드리며 완벽하게 작동합니다! – federicot

1

먼저와 <br /> 태그를 교체 <br />\n</p><p> 또는 </div><div>은 각각 </p>\n<p></div>\n<div>입니다.

strip tags에 대한 PHP 함수를 사용하면 개행 문자가 있어야하는 모든 곳에 개행 문자가있는 멋진 일반 텍스트가 제공됩니다.

그러면 일관성을 위해 \r\n\n으로 바꿀 수 있습니다. 그 후에야 원하는 길이의 텍스트를 추출 할 수 있습니다.

word wrapping을 사용하여 10 가지 목표를 달성 할 수 있습니다. 단어 줄 바꿈이 작동하려면 한 줄에 여러 문자를 정의해야하며 단어 줄 바꿈은 중간 단어를 제동하지 못하게합니다.

단어 랩을 사용하기 전에 @PeeHaa가 제안한대로 html_entity_decode을 사용할 수 있습니다.