| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | <?php namespace System;class Text {    /**     * Limit the words in a string. Word integrity will be preserved.     *     * @param  string  $value     * @param  int     $limit     * @param  string  $end     * @return string     */    public static function words($value, $limit, $end = '…')    {        if (trim($value) == '')        {            return $value;        }        // -----------------------------------------------------        // Limit the words in the string.        // -----------------------------------------------------        preg_match('/^\s*+(?:\S++\s*+){1,'.$limit.'}/', $value, $matches);        // -----------------------------------------------------        // If the string did not exceed the limit, we won't        // need an ending character.        // -----------------------------------------------------        if (strlen($value) == strlen($matches[0]))        {            $end = '';        }        return rtrim($matches[0]).$end;    }    /**     * Limit the number of characters in a string. Word integrity will be preserved.     *     * @param  string  $value     * @param  int     $limit     * @param  string  $end     * @return string     */    public static function characters($value, $limit, $end = '…')    {        if (strlen($value) < $limit)        {            return $value;        }        // -----------------------------------------------------        // Replace new lines and whitespace in the string.        // -----------------------------------------------------        $value = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $value));        if (strlen($value) <= $limit)        {            return $value;        }        $out = '';        // -----------------------------------------------------        // The string exceeds the character limit. Add each word        // to the output individually until we reach the limit.        // -----------------------------------------------------        foreach (explode(' ', trim($value)) as $val)        {            $out .= $val.' ';            if (strlen($out) >= $limit)            {                $out = trim($out);                return (strlen($out) == strlen($value)) ? $out : $out.$end;            }        }    }    /**     * Censor a string.     *     * @param  string  $value     * @param  array   $censored     * @param  string  $replacement     * @return string     */    public static function censor($value, $censored, $replacement = '####')    {        $value = ' '.$value.' ';        // -----------------------------------------------------        // Assume the word will be book-ended by the following.        // -----------------------------------------------------        $delim = '[-_\'\"`(){}<>\[\]|!?@#%&,.:;^~*+=\/ 0-9\n\r\t]';        // -----------------------------------------------------        // Replace the censored words.        // -----------------------------------------------------        foreach ($censored as $word)        {            if ($replacement != '')            {                $value = preg_replace("/({$delim})(".str_replace('\*', '\w*?', preg_quote($word, '/')).")({$delim})/i", "\\1{$replacement}\\3", $value);            }            else            {                $value = preg_replace("/({$delim})(".str_replace('\*', '\w*?', preg_quote($word, '/')).")({$delim})/ie", "'\\1'.str_repeat('#', strlen('\\2')).'\\3'", $value);            }        }        return trim($value);            }}
 |