String Cutting Helper in Zend Framework

It’s the string cutting helper which deal with both UTF8 and others encodings. Also it remove html tags by default.

 

/**
 * 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;
    }
}
Posted in Zend Framework | Tagged , | Leave a comment