Web

Как выполнить усечение строки до первых n символов и добавить три точки в конце

Как получить первые 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;

}

Объяснение:

  1. если $str короче, чем $n_chars, возвращается строка неизменная.

  2. если $str равен $n_chars, возвращается исходная строка.

  3. если $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 = '&#8230;') {

        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 = '&#8230;') {

        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

Что с точки зрения непрофессионала, является рекурсивной функцией в PHP

Web

Как преобразовать объект в массив

Web

Выполнение фонового процесса в PHP

Web

Транзакции в PHP + MySQL