2013-09-16 4 views
0

Я знаю различные способы усечения строки HTML на определенную длину, включая/не включая теги HTML, как часть результата и/или усечение при сохранении целых слов и еще чего-то. Моя проблема, однако, заключается в том, что строка содержит специальные символы, такие как – или &Как обрезать HTML со специальными символами?

Мне нужно усечь строку до 100 символов (или несколько меньше, если она иначе обрезается в середине специального символа). Сейчас у меня есть функция:

$result= truncateIfNecessary(strip_tags($fullText), 100); //ignore HTML tags 

function truncateIfNecessary($string, $length) { 
    if(strlen($string) > $length) { 
     return substr($string, 0, $length).'...'; 
    } else { 
     return $string; 
    } 
} 

Но если строка что-то вроде text text – text (отображается на странице, как: text text - text и $length падений в –, он возвращает text text &nda..., который отображает именно так, когда я должен был бы это вернуться text text...

EDIT:.

(отправил в ответ)

+3

Преобразование их в символы затем обрезает, а затем преобразовать обратно в HTML-теги. – Pitchinnate

+2

http://php.net/manual/en/function.html-entity-decode.php – user2180613

+0

@Pitchinnate, что почти сработало, но не полностью для всех html-символов - ex: • не конвертировал – WOUNDEDStevenJones

ответ

0

Я попытался

function truncateIfNecessary($string, $length) { 
    if(strlen($string) > $length) { 
     $string = html_entity_decode(strip_tags($string)); 
     $string = substr($string, 0, $length).'...'; 
     $string = htmlentities($string); 
     return $string; 
    } else { 
     return strip_tags($string); 
    } 
} 

, но по какой-то причине он пропустил несколько – и •. На данный момент я нашел решение в http://alanwhipple.com/2011/05/25/php-truncate-string-preserving-html-tags-words/ (связанное с Shortening text tweet-like without cutting links inside) отлично работает - обрабатывает htmltags, сохраняет целые слова (или нет) и htmlentities. Теперь это просто:

function truncateIfNecessary($string, $length) { 
    if(strlen($string) > $length) { 
     return truncateHtml($string, $length, "...", true, true); 
    } else { 
     return strip_tags($string); 
    } 
} 
0

Я думаю, ваша проблема будет решить d, изменив первую строку кода:

$result = strip_tags(truncateIfNecessary($fullText, 100)); 

образом, вы первый регулировать длину и после этого позаботиться о HTML символов.

+0

Это сработает, но я считаю, что это приведет к неправильной длине, потому что оно рассмотрит теги как часть длины. Конечный результат, вероятно, будет непоследовательно короче 100 символов. – WOUNDEDStevenJones

+0

@WOUNDEDStevenJones Да, вы правы, декодирование в начале функции и кодирование в конце было бы лучшим решением, я думаю. – SharpKnight

+0

Я тоже это пробовал, и он не работал на 100%, но он намного ближе, чем я начал. См. Мой отредактированный вопрос. – WOUNDEDStevenJones

0

Используйте функцию wordwrap php.

что-то вроде этого:

$result = wordwrap(strip_tags($fullText), 100, "...\n"); // Remove HTML and split 
$result = explode("\n", $result); 
$result = $result[0]; // Select the first group of 100 characters 
+1

Имеет ли это какое-либо отношение к специальным символам html ...? – WOUNDEDStevenJones

+0

Нет, функция wordwrap извлекает только X символов из заданной строки, используя пробел char в качестве разделителя (всегда извлекайте точное слово). –

+0

@WOUNDEDStevenJones На самом деле, да. Семантически сущности HTML являются словами, поэтому вы либо будете иметь их в полном объеме, либо не иметь их вообще. Хотя специальная обработка должна выполняться для текстов без пробелов. Также я бы рекомендовал использовать '\ 0' вместо' \ n'. – user

0
function _truncate($string,$lenMax = 100) { 

    $len = strlen($string); 
    if ($len > $lenMax - 1) { 
     $string = substr(strip_tags($string),0,$lenMax); 
     $string = substr($string,0,strrpos($string," ")).'...'; 
    } 

    return $string; 
} 
Смежные вопросы