2013-08-08 2 views
0

저는 블로그를 쓰고 있으며 게시물의 발췌 내용을 보여주는 함수가 필요합니다. 텍스트가 503 자보다 긴 경우 부분 문자열 검사를 사용하고 있습니다.문장을 짧게하고 가장 가까운 점을 찾습니다.

하지만이 방법은 내 텍스트를 단어 중간과 HTML 태그 중간에 자르기 때문에 나머지 페이지는 태그 절반으로 작성합니다.

즉 : 그것은 새로운 강력한 엔드 태그 안타까지 "text text text <strong>Another piece of te [...]과 페이지의 나머지 부분은 강한

내 텍스트 일부 게시물의 요소 만 않은 형식을 제거하려고

방법.. "좋아, 텍스트는 980 자이며, 마지막 점 (.)으로 이동하거나 태그를 완성하는 데 필요한 것은 무엇이든간에 503 자로 자른다.

<?php 
    $testo_preview = preg_replace("/<img[^>]+\>/i", ' ', $valore->testo); 
    $testo_preview = preg_replace("/<a[^>]+>/i", '<a>', $testo_preview); 
    $testo_preview = preg_replace("/<span[^>]+>/i", '<span>', $testo_preview); 
    $testo_preview = preg_replace("/<div[^>]+>/i", '', $testo_preview); 
    $testo_preview = str_replace("</div>", '', $testo_preview); 
    $testo_preview = str_replace("\n", '<br>', $testo_preview); 
?> 

<?php if(strlen($testo_preview) >= 503): ?> 

    <?= substr($testo_preview, 0, 503).' [...]' ?> 

<?php else: ?> 

    <?= $testo_preview; ?> 

<?php endif; ?> 

편집 :

내 현재 코드 따릅니다 나는 실제로 "지점에 도달"로, 확인 작업을 할 파블의 대답을 찾을

을 ...

새로운 DOMDocument() 부분은 html 악센트를 엉망으로 만들었습니다 (이탈리아어에서는 몇 가지 악센트를 사용하고 머물러야했습니다). 나는 Tigger의 코드를 사용하여 함수로 변환 했으므로 둘 다 upvoted. 나는 쉬운 기능을 함께했다 :

function cleanCut($cutAt, $str){ 
     $next_dot = strpos($str, '.', $cutAt); 
     if ($next_dot !== false){ 
      // text after default cutoff contains a dot so we need to extend the cutoff 
      $preview_text = substr($str, 0, $next_dot + 1); 
      // HTML Cleanup 
      $preview_text = strip_tags($preview_text); 
      $preview_text = str_replace("\n", '<br>', $preview_text);   
     } else { 
      $preview_text = $str; 
     } 

     return $preview_text; 
    } 

그것은 잘 좋은 작동합니다. 때로는 (긴 링크가있을 때) 요점에 도달하지는 않지만 괜찮을 수 있습니다. 지금 내가 실제로 원하는 유일한 태그 인 것처럼 <br>으로 \n을 바꾸려고 시도한 기능에서 알 수 있듯이 작동하지만 작동하지 않습니다. 왜 어떤 생각?

+0

http://stackoverflow.com/a/1732454/1180785 – Dave

+1

편집 후 : strip_tags'로 변경'strip_tags ($의 preview_text)'($의 preview_text, '
') '과 다음 줄을 제거합니다. [PHP 매뉴얼] (http : // php.net/strip_tags)'strip_tags()에 대한 더 많은 정보를 얻으려면 – Tigger

답변

1

이 기능은 특정 지점이나 그 직후에 문자열을 깨끗하게 잘라내어 모든 HTML 태그도 제거합니다. &#8230;은 '...'의 HTML 코드로 단일 문자입니다.

// strips HTML tags and return a clean word cut at a certain point 
// or just after it. 
function cleanCut($cutAt, $str) { 
    $tmp = strip_tags($str); 
    $tmp = explode(' ',$tmp); 
    foreach($tmp as $k => $v) { 
     $cleanStr .= $v.' '; 
     if (strlen($cleanStr) >= $cutAt) { 
      return trim($cleanStr).'&#8230;'; 
     } 
    } 
    // and it case it is a short string 
    return $cleanStr; 
} 
+0

Tks, 내 편집을 참조하십시오. –

1

내가 틀리지 않다면 잠시 태그를 무시하면됩니다. 마지막으로 필요한 기간을 찾은 다음 열린 태그를 정리하십시오. 한 가지 접근 방법은 다음과 같습니다. 1. 503 자 뒤에 점의 위치를 ​​찾습니다. 아무 것도 발견되지 않으면 전체 텍스트를 표시하고 그렇지 않으면 해당 부분 문자열을 표시합니다. 우리는 strpos에 오프셋을 사용합니다. 2. 열려있는 태그를 닫으려면 HTML을 정리하십시오. 3. DOMDocument가 전체 HTML 문서를 출력하기 때문에 초과분을 제거해야합니다.

예 :

$max_length = 16; 
$full_text = "<b>Lorem ****. Impsum ****. That's already too long.</b>"; 
$next_dot = strpos($full_text, '.', $max_length); 

if ($next_dot !== false) 
{ 
    // text after default cutoff contains a dot so we need to extend the cutoff 
    $preview_text = substr($full_text, 0, $next_dot + 1); +1 so that the last dot is in 
    // HTML Cleanup 
    $doc = new DOMDocument(); 
    $doc->loadHTML("$preview_text"); 
    $preview_text = $doc->saveHTML(); 
    $preview_text = preg_replace('/(.*)<body>|(<\/body>.*)/ism', '', $preview_text); 
} else { 
    $preview_text = $full_text; 
} 

echo $preview_text; 

이 조금 순진이며 만에 몇 분명 문제가있다. 그것은 충분하거나 b. 당신은 스스로 개선 할 수 있습니다. 오, 그 다음에 c. 당신은 더 많은 질문을합니다 :)

+0

Tks, 제발 편집을 참조하십시오. –

관련 문제