Как получить первые n символы строки в PHP? Какой самый быстрый способ обрезать строку до определенного количества символов и добавить '...' при необходимости?
Ответ 1
//Простая версия для 10 символов от начала строки
$string = substr($string,0,10).'...';
На базе предположения о длинах строк (а также обеспечения одинаковой длины на усеченных строках):
$string = (strlen($string) > 13) ? substr($string,0,10).'...' : $string;
Таким образом, вы получите строку максимум из 13 символов; либо 13 (или меньше) обычных символов, либо 10 символов, за которыми следует '...'.
Например, такая функция:
function truncate($string, $length, $dots = "...") {
return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string;
}
Можно дополнить функцию, которая лучше работает и предотвращает разрыв строки в середине слова с помощью встроенной функции wordwrap:
function truncate($string,$length=100,$append="…") {
$string = trim($string);
if(strlen($string) > $length) {
$string = wordwrap($string, $length);
$string = explode("\n", $string, 2);
$string = $string[0] . $append;
}
return $string;
}
Ответ 2
Расширение Multibyte может пригодиться, если вам нужен контроль над кодовой строкой.
$charset = 'UTF-8';
$length = 10;
$string = 'Привет ребята! Я здесь!';
if(mb_strlen($string, $charset) > $length) {
$string = mb_substr($string, 0, $length - 3, $charset) . '...';
}
Ответ 3
Иногда необходимо ограничить строку последним полным словом, т. е. вы не хотите, чтобы последнее слово было оборвано, вместо этого вы остановитесь на втором последнем слове.
Например: нам нужно ограничить "Это моя строка" до 5 символов, но вместо 'Это м...' мы хотим, чтобы это было 'Это...', т. е. мы пропустим «битые» буквы в последнем слове.
class Fun {
public function limit_text($text, $len) {
if (strlen($text) < $len) {
return $text;
}
$text_words = explode(' ', $text);
$out = null;
foreach ($text_words as $word) {
if ((strlen($word) > $len) && $out == null) {
return substr($word, 0, $len) . "...";
}
if ((strlen($out) + strlen($word)) > $len) {
return $out . "...";
}
$out.=" " . $word;
}
return $out;
}
}
Ответ 4
Если необходимо сократить строку, но не разделять на слова, можно сделать следующее:
function ellipse($str,$n_chars,$crop_str=' [...]') {
$buff=strip_tags($str);
if(strlen($buff) > $n_chars) {
$cut_index=strpos($buff,' ',$n_chars);
$buff=substr($buff,0,($cut_index===false? $n_chars: $cut_index+1)).$crop_str;
}
return $buff;
}
Объяснение:
если $str короче, чем $n_chars, возвращается строка неизменная.
если $str равен $n_chars, возвращается исходная строка.
если $str длиннее $n_chars, то ищется следующий пробел до усечения или (если до конца нет пробелов) $str грубо обрезается на $n_chars.
ПРИМЕЧАНИЕ: имейте в виду, что этот метод удалит все теги в случае HTML.
Ответ 5
Фреймворк codeigniter содержит помощник для этого, называемый "text helper". Вот документация из руководства пользователя Codeigniter: http://codeigniter.com/user_guide/helpers/text_helper.html (просто прочитайте разделы word_limiter и character_limiter). Вот две функции из него, относящиеся к вашему вопросу:
if ( ! function_exists('word_limiter')) {
function word_limiter($str, $limit = 100, $end_char = '…') {
if (trim($str) == '') {
return $str;
}
preg_match('/^\s*+(?:\S++\s*+){1,'.(int) $limit.'}/', $str, $matches);
if (strlen($str) == strlen($matches[0])) {
$end_char = '';
}
return rtrim($matches[0]).$end_char;
}
}
И еще:
if ( ! function_exists('character_limiter')) {
function character_limiter($str, $n = 500, $end_char = '…') {
if (strlen($str) < $n) {
return $str;
}
$str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));
if (strlen($str) <= $n) {
return $str;
}
$out = "";
foreach (explode(' ', trim($str)) as $val) {
$out .= $val.' ';
if (strlen($out) >= $n) {
$out = trim($out);
return (strlen($out) == strlen($str)) ? $out : $out.$end_char;
}
}
}
}
Web