Dzięki... Nie jest to ideał (np. wymóg XHTML) ale za to podsunał mi własny pomysł którego szybka implementacja znajduje się poniżej:
<?php
/**
* Diablos HTML truncate
*
* My version of choping strings (with html tags) around a specified length.
*
* @author Diabl0
* @version 0.5
* @uses Tidy Functions
*
* @param string $text
* @param integer $minimum_length
* @param integer $length_offset
* @param boolean $word_cut
* @param string $postfix
* @return string
*/
function my_html_substr($text, $minimum_length = '256', $length_offset = '20', $word_cut = false, $postfix = '...') {
$tag_counter = 0;
$quotes_on = FALSE;
// $text = html_entity_decode($text);
$st = 0;
for ($i = 0; $i < strlen($text); $i++) { $current_char = substr($text,$i,1
); if ($current_char == '<') {
// Mamy początek znacznika - zakończenia znacznika
$jump = strpos($text, '>', $i); $i = $jump;
} else {
// Mamy czysty znak, liczymy go i jedziemy dalej.
$st++;
}
// Mamy cały string?
if ($st == $minimum_length) {
if ($word_cut != True) {
// Nie możemy ciąć słów :( więc trzeba znależć spację lub enter
$space = strpos($text, ' ', $i); $enter = strpos($text, "\n", $i); if ( ($space < $enter OR
!$enter) AND
$space < strlen($text) AND
$space < $minimum_length+$length_offset) { $output = $output = substr($text, 0
, $space); } elseif ( ($space > $enter OR
!$space) AND
$enter < strlen($text) AND
$enter < $minimum_length+$length_offset) { $output = $output = substr($text, 0
, $enter); } else {
$output = $text;
}
} else {
// Możemy ciąć więc tniemy jak leci
$output = substr($text, 0
, $i); }
$output .= $postfix;
// Mamy nasz upragniony string, czas go poprawić pod kątem zamkniętych znaczników
if( function_exists( 'tidy_parse_string' ) ) {
$tidy_config = array( 'indent' => TRUE, 'wrap' => 0
); $html = $output;
$html = tidy_repair_string($html, $tidy_config, 'raw');
$output = $html;
}
return $output;
}
}
}
return $text;
}
?>
Nie jest on idealny (wymaga Tidy), dokładnie sprawdzony (nie jestem pewien wszystkich warunków), ani nawet ładny (jeszcze nad nim myślę), czy porządnie skomentowany (powstawał na szybko). Ale wrzucam go tutaj do skomentowania (i być może podsunięcia innych ciekawych rozwiązań).