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

Редактировать:

я нашел Pawel ответ будет работать нормально, как это на самом деле "попадает в точку" ...

Мне пришлось изменить новую часть DOMDocument(), поскольку она испортила html-акценты (на итальянском мы используем некоторые акценты, и мне нужно было их остаться). Я превращаю его в функцию, принимая часть кода от Tigger, поэтому я поддержал вас обоих. я придумал простую функцию:

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

Он работает отлично и хорошо. Только иногда не доходит до точки (когда есть длинная ссылка), но это может быть хорошо. Теперь, как вы видите из функции, я попытался заменить \n на <br>, так как это единственный тег, который я действительно хочу, но он не работает. Любая идея о том, почему?

+0

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

+1

После редактирования: Изменение 'strip_tags ($ PREVIEW_TEXT)' 'до strip_tags ($ 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 символов. Если ни один не найден, вы показываете весь текст, иначе подстроку в эту точку. Мы будем использовать offset для 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, см. мое редактирование, пожалуйста. –

Смежные вопросы