Получить первые n символов строки - PullRequest
299 голосов
/ 02 июля 2010

Как я могу получить первые n символов строки в PHP?Какой самый быстрый способ обрезать строку до определенного количества символов и добавить «...», если необходимо?

Ответы [ 18 ]

546 голосов
/ 02 июля 2010
//The simple version for 10 Characters from the beginning of the string
$string = substr($string,0,10).'...';

Обновление:

Основано на предложении проверить длину (а также обеспечить одинаковую длину на обрезанных и необрезанных строках):

$string = (strlen($string) > 13) ? substr($string,0,10).'...' : $string;

Таким образом, вы получите строку максимум13 символов;либо 13 (или меньше) обычных символов, либо 10 символов, за которыми следует «...»

Обновление 2:

Или как функция:

function truncate($string, $length, $dots = "...") {
    return (strlen($string) > $length) ? substr($string, 0, $length - strlen($dots)) . $dots : $string;
}

Обновление 3:

Прошло много времени с тех пор, как я написал этот ответ, и я больше не использую этот код.Я предпочитаю эту функцию, которая предотвращает разрыв строки в середине слова с помощью функции 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;
}
105 голосов
/ 04 июля 2014

Эта функциональность была встроена в PHP начиная с версии 4.0.6. См. Документы .

echo mb_strimwidth('Hello World', 0, 10, '...');

// outputs Hello W...

Обратите внимание, что trimmarker (многоточие выше) включены в усеченную длину.

15 голосов
/ 02 июля 2010

Расширение Multibyte может пригодиться, если вам нужен контроль над строковым набором символов.

$charset = 'UTF-8';
$length = 10;
$string = 'Hai to yoo! I like yoo soo!';
if(mb_strlen($string, $charset) > $length) {
  $string = mb_substr($string, 0, $length - 3, $charset) . '...';
}
9 голосов
/ 23 марта 2013

иногда вам нужно ограничить строку последним полным словом, т.е. вы не хотите, чтобы последнее слово было разбито, вместо этого вы останавливаетесь на втором последнем слове.

например: нам нужно ограничить «Это моя строка» до 6 символов, но вместо «Это я ...» мы хотим, чтобы это было «Это ...», то есть мы пропустим эти разбитые буквы в последнем слове.

тьфу, плохо объясняю, вот код.

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;
    }

}
8 голосов
/ 17 июля 2013

Если вы хотите сократить осторожность, чтобы не разделить слова, вы можете сделать следующее

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.

8 голосов
/ 06 июля 2010

Платформа codeigniter содержит помощник для этого, называемый «текстовый помощник».Вот некоторая документация из руководства пользователя 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;
            }       
        }
    }
}
4 голосов
/ 02 июля 2010

Использовать подстроку

http://php.net/manual/en/function.substr.php

$foo = substr("abcde",0, 3) . "...";
3 голосов
/ 02 июля 2010
if(strlen($text) > 10)
     $text = substr($text,0,10) . "...";
1 голос
/ 21 марта 2013

Это то, что я делаю

    function cutat($num, $tt){
        if (mb_strlen($tt)>$num){
            $tt=mb_substr($tt,0,$num-2).'...';
        }
        return $tt;
    }

, где $ num обозначает число символов, а $ tt - строку для манипуляции.

1 голос
/ 25 июля 2013

Я не уверен, что это самое быстрое решение, но похоже, что оно самое короткое:

$result = current(explode("\n", wordwrap($str, $width, "...\n")));

PS. Вот несколько примеров здесь https://stackoverflow.com/a/17852480/131337

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...