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, но зато нет слов порезанных на половине. Если конечно их не было в исходном тексте))

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


UPDATE 05.10.2020

Один знакомый, прочтя этот пост, спросил: А куда эту функцию вставлять.

Я сдержался от очевидной шутки и теперь дописываю это самое «в куда». Но сразу предупреждаю, если вы с php «на вы», то лучше обратиться к специалисту и всё-такое. Потому, что сайт можно убить всего одним не к месту вставленным символом.

А для тех, кто немного понимает, поясняю. Если речь про WordPress, то вставить эту функцию нужно в конец файла function.php в папке с активной темой. А использовать, вставив в код вызова функции и передав ей параметры.

trim_news($str, 100);

 

Куда именно вставлять вызов функции, зависит от того, где вам понадобилось обрезать текст.

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