It’s the string cutting helper which deal with both UTF8 and others encodings. Also it remove html tags by default.
[codesyntax lang=”php” lines=”no”]
/**
* Takes a string and optionally a maximum length and 'cut' the string to match that length
* based on words and not on characters.
*
* @author kim
*/
class App_View_Helper_Cut extends Zend_View_Helper_Abstract
{
/**
* do string cut
*
* @param string $pStr - The string to be cut
* @param intefer $pMaxLen - The maximum length cut
* @return string
*/
public function cut($pStr, $pMaxLen = 40)
{
// filter all the tags
$filter = new Zend_Filter_StripTags();
$pStr = trim($filter->filter($pStr));
$returnStr = $this->cutstr($pStr, $pMaxLen, '...');
return $returnStr;
}
/**
* cut string, utf8 by default
*
* @param $string - string to cut
* @param $length - Max length to cut
* @param $dot - the tail added to the sub-string
* @param $encoding - the encoding of string
* @return string
*/
public function cutstr($string, $length, $dot = '', $encoding = 'utf8')
{
if (strlen($string) <= $length) {
return $string;
}
$strcut = '';
if (strtolower($encoding) == 'utf8') {
$n = $tn = $noc = 0;
while ($n < strlen($string)) {
$t = ord($string[$n]);
if ($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
$tn = 1; $n++; $noc++;
} elseif(194 <= $t && $t <= 223) {
$tn = 2; $n += 2; $noc += 2;
} elseif(224 <= $t && $t < 239) {
$tn = 3; $n += 3; $noc += 2;
} elseif(240 <= $t && $t <= 247) {
$tn = 4; $n += 4; $noc += 2;
} elseif(248 <= $t && $t <= 251) {
$tn = 5; $n += 5; $noc += 2;
} elseif($t == 252 || $t == 253) {
$tn = 6; $n += 6; $noc += 2;
} else {
$n++;
}
if ($noc >= $length) {
break;
}
}
if ($noc > $length) {
$n -= $tn;
}
$strcut = substr($string, 0, $n);
} else {
for($i = 0; $i < $length - strlen($dot) - 1; $i++) {
if (ord($string[$i]) > 127) {
$strcut .= $string[$i] . $string[++$i];
} else {
$strcut .= $string[$i];
}
}
}
return $strcut . $dot;
}
}
[/codesyntax]