PHP: Как обрезать текст?

Казалось бы, обрезка текста (например новости для анонса) — это такое дело, про которое и говорить нечего. Ну а что? Берём mb_substr, чик, и готово!

mb_substr обрезает строковую переменную с такого-то знака по такой-то. То что надо? Нет?

$string = mb_substr($string, 0, 100); //Сохраняем в $string первые 100 символов (с 0 до 100) 

 

Нет! Потому, что такая обрезка может отчекрыжить слово посередине и в вашем анонсе вместо, например, «главный герой книги попал на необитаемый остров» читатель увидит «главный герой книги попа». Этот главный герой конечно тот ещё жук и выражение справедливо, но… несколько нелитаратурно. Поэтому, обрезку нужно делать не только по символам, но и по словам.

А если в тексте новости встечается html-тэг? При обрезка открывающий останется, а закрывающий исчезнет и вёрстку сайта распедячит так, что страшно смотреть. Поэтому, mb_substr вещь замечательная, но нужно её использовать с умом.

Например вот так.

	function trim_news($str, $znaki = 100) {
		$str = strip_tags(trim($str));
		if (mb_strlen($str, 'utf-8') <= $znaki) {
			return $str;
		}
		$arrStr1 = explode(' ', $str);
		$arrStr2 = explode(' ', mb_substr($str, 0, $znaki));
		$str = '';
		foreach ($arrStr2 as $key => $val) {
			if ($val == $arrStr1[$key]) {
				$str .= $val . ' ';
			}
		}
		return trim($str) . '...';
	}

В эту функцию мы передаём первым параметром ($str) строку, которую нужно обрезать. Вторым ($znaki) — количество символов, которое должно остаться в строке.
Впрочем, $znaki — необязательный параметр. Если его убрать, будет использовано значение по умолчанию — 100.

Вот так функцию можно вызывать: trim_news(«Некий текст или переменная», 150);

Что делает функция?

1. Вырезает все html-тэги и лишние пробелы.
2. Проверяет длину $str и если она меньше или равна $znaki, то функция вернёт $str (без тэгов и лишних пробелов). Потому, что зачем резать то что и так укладывается в нужный размер?
3. Если длина превышает заданную в параметре $znaki, значит будем резать! Создадим два массива. В один (эталонный) просто разобьём нашу $str по пробелам (получится одна ячейка — одно слово). В другой (урезанный) разбитую по тем же пробелам, урезанную по количеству знаков $str.
4. Очистим исходную $str и заново заполним, перебирая урезанный массив и сравнивая его значения (отдельные слова) с эталонным. Если слово не совпадает с исходным, мы его не пишем. Это то самое последнее слово, которое обрезано на середине.
5. Заново заполненную $str очищаем от лишних проблелов. Скорее всего один лишний будет в конце. Добавляем в конец $str многоточие и отдаём.

Вот теперь, текст обрезан красиво. Да, там может быть меньше знаков (или чуть больше, с учётом многоточия), чем указано в $znaki, но зато нет слов порезанных на половине. Если конечно их не было в исходном тексте))

Теперь наш пример, «главный герой книги попал на необитаемый остров», обрезался до «главный герой книги…». Не так интригует, но зато отсутствуют незапланированные смыслы.))

Напишите комментарий