X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Дополнения в класс Strings
Easy-Web
сообщение 2010-12-24, 13:32
Сообщение #1
Любитель
Иконка группы

Группа: Eleanor user
Сообщений: 132
Регистрация: 2009-08-17
Из: Алма-ата, Казахстан

Репутация:   нет  
Всего: 1


Шалом други!
Хочу поделиться новыми фичами для класса Strings (не белье)

1. Модификация функции CutStr которая отрезает от текстового блока начальный кусок фиксированных размеров.
Как известно, в UTF8 она режет некрасиво несмотря на использование функций для многобайтных кодировок. В месте отреза появляется нечитаемый символ. Да и некрасиво, когда разрез происходит посреди слова. Мой вариант этой функции режет только в конце слова, на которое выпадает первоначальное место разреза, определяемое переменной $cnt :

	public static function CutStr($str,$cnt=30,$end='...')
	{
		if(mb_strlen($str)>$cnt)
		{
			$str=preg_replace('#[&<][^;>]*$#','',$str);
			$prevlimit = $cnt;
			while (($prevlimit+100> $cnt) and (mb_substr($str,$cnt,1) != ' ')) {
				$cnt++;
			}
			$str=mb_substr($str,0,$cnt).$end;
		}
		return $str;
	}


Функцию нужно вставить вместо прежней в файл class_strings.php вызывается она следующим образом

Strings::CutStr( ТЕКСТ, ЧИСЛО СИМВОЛОВ ОГРАНИЧЕНИЯ, СТРОКА ВСТАВЛЯЮЩАЯСЯ В КОНЦЕ ОБРЕЗКИ)




2, Далее функция наподобие HumanDate но которая возвращает не абсолютную а относительную человекоподобную дату, например "чуть более минуты назад", "час назад", "три дня назад" и т.п.

	public static function RelativeDate($time_value='') {
	$time_stamp = strtotime($time_value);
		$delta=time()-$time_stamp;
	    if ($delta < 60) {
	        return 'минуту назад';
	    } elseif ($delta < 120) {
	        return 'чуть более минуты назад';
	    } elseif ($delta < (45 * 60)) {
	        $declOfNum = self::declOfNum(($delta / 60), array(' минуту назад ', ' минуты назад', ' минут назад'));
	        return intval($delta / 60).$declOfNum;
	    } elseif ($delta < (90 * 60)) {
	        return 'примерно час назад';
	    } elseif ($delta < (24 * 60 * 60)) {
	        $declOfNum = self::declOfNum(($delta / 3600), array(' час назад ', ' часа назад', ' часов назад'));
	        return intval($delta / 3600).$declOfNum;
	    } elseif ($delta < (48 * 60 * 60)) {
	        return 'вчера';
	    } else {
	        $declOfNum = self::declOfNum(($delta / 86400), array(' день назад ', ' дня назад', ' дней назад'));
	        return intval($delta / 86400).$declOfNum;
	    }
	}
	protected static function declOfNum($number, $titles) {
		$cases = array(2, 0, 1, 1, 1, 2);
		return $titles[($number % 100 > 4 && $number % 100 < 20) ? 2 : $cases[($number % 10 < 5) ? $number % 10 : 5]];
	}


вторая функция "declOfNum" требуется для служебных целей.

Все это хозяйство помещается в файл class_strings.php и вызывается следующим образом Strings::RelativeDate( ДАТА ) где ДАТА в виде "ГГГГ-ММ-ДД ЧЧ:ММ:СС"









Сообщение отредактировал Easy-Web - 2010-12-26, 10:46
Перейти в начало страницы
+Цитировать сообщение
Easy-Web
сообщение 2010-12-25, 13:46
Сообщение #2
Любитель
Иконка группы

Группа: Eleanor user
Сообщений: 132
Регистрация: 2009-08-17
Из: Алма-ата, Казахстан

Репутация:   нет  
Всего: 1


Фигасе никому не надо???
Перейти в начало страницы
+Цитировать сообщение
KeSSLeR
сообщение 2010-12-25, 18:03
Сообщение #3
Любитель
Иконка группы

Группа: Eleanor user
Сообщений: 483
Регистрация: 2010-02-11
Версия системы: RC5

Репутация:   нет  
Всего: нет


Easy-Web, надо. Через неделю - две комунить до понадобится.

Сообщение отредактировал KeSSLeR - 2010-12-25, 18:03
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2010-12-26, 1:54
Сообщение #4
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 261
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


Easy-Web, благодарю, полезные внедрения. Думаю, найдутся те, кто обязательно воспользуется Вашими трудами.
Перейти в начало страницы
+Цитировать сообщение
Loader
сообщение 2010-12-29, 16:13
Сообщение #5
Профессионал
Иконка группы

Группа: Eleanor user
Сообщений: 1 161
Регистрация: 2010-04-19

Репутация:   нет  
Всего: нет


Easy-Web , спасибо!
Мне лично очень пригодилось взамен substr.
Перейти в начало страницы
+Цитировать сообщение

Ответить в данную темуНачать новую тему
0 чел. читают эту тему (гостей: 0, скрытых пользователей: 0)
Пользователей: 0

 
RSS Текстовая версия 0.0441 сек.    11 запросов    GZIP включен    Сейчас: 2021-07-23, 19:37