Получить первые n символов строки

248

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

  • 5
    может быть лучше использовать символ многоточия ...
  • 1
    проверьте мой ответ, если вам нужно избежать сокращения слов.
Показать ещё 2 комментария
Теги:
string

18 ответов

424
Лучший ответ
//The simple version for 10 Characters from the beginning of the string
$string = substr($string,0,10).'...';

Update:

Исходя из предложения по проверке длины (а также обеспечения одинаковой длины на обрезанных и необрезанных строках):

$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;
}
  • 11
    может быть лучше заменить многоточием (…), а не 3 точками (...)
  • 3
    Я люблю это, но я изменил это и использую следующее, чтобы удалить пробел в конце: $ string = substr (trim ($ string), 0,10) .'... '; Таким образом, вы получите что-то вроде «мне нравится ...» вместо «мне нравится ...».
Показать ещё 5 комментариев
89

Это было встроено в PHP с версии 4.0.6, я удивлен сочетанием возраста этого вопроса и того факта, что никто не упомянул об этом ни в одном из ответов

из документов: http://www.php.net/manual/en/function.mb-strimwidth.php

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

// outputs Hello W...
  • 4
    Работал отлично для меня. Верхний ответ не сработал, и я рад, что это не сработало, потому что прокручивал и нашел этот драгоценный камень.
  • 0
    Спасибо, я всегда использовал этот более длинный и старый метод!
Показать ещё 5 комментариев
13

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

$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) . '...';
}
  • 0
    Этот код добавляет три точки в строку? В моем коде есть тег ссылки <a>, и когда я его создаю, он связывает его вместе с тремя точками, которые будут иметь другое значение.
9

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

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

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

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

}
7

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

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.

7

Структура 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

Используйте подстроку

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

$foo = substr("abcde",0, 3) . "...";
  • 3
    Этот код всегда будет добавлять ... к строке, которую он не хотел.
  • 0
    Вы абсолютно правы, и я соответственно отредактировал ответ. (Пересмотренный ответ в настоящее время ожидает ТАК рецензирования)
2
if(strlen($text) > 10)
     $text = substr($text,0,10) . "...";
  • 0
    От @Brendon Bullen выше .. $ string = (strlen ($ string)> 13)? substr ($ string, 0,10) .'... ': $ string; Ницца !
1

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

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

P.S. Примеры здесь приведены https://stackoverflow.com/questions/79960/how-to-truncate-a-string-in-php-to-the-word-closest-to-a-certain-number-of-chara

1

Чтобы создать внутри функции (для повторного использования) и динамической ограниченной длины, используйте:

function string_length_cutoff($string, $limit, $subtext = '...')
{
    return (strlen($string) > $limit) ? substr($string, 0, ($limit-strlen(subtext))).$subtext : $string;
}

// example usage:
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26);

// or (for custom substitution text
echo string_length_cutoff('Michelle Lee Hammontree-Garcia', 26, '..');
1

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

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

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

1

Я разработал функцию для этого использования

 function str_short($string,$limit)
        {
            $len=strlen($string);
            if($len>$limit)
            {
             $to_sub=$len-$limit;
             $crop_temp=substr($string,0,-$to_sub);
             return $crop_len=$crop_temp."...";
            }
            else
            {
                return $string;
            }
        }

вы просто вызываете функцию со строкой и limite
например: str_short("hahahahahah",5);
он вырезает вашу строку и добавит "..." в конец
 :)

1

Используемая функция:

function cutAfter($string, $len = 30, $append = '...') {
        return (strlen($string) > $len) ? 
          substr($string, 0, $len - strlen($append)) . $append : 
          $string;
}

Смотрите в действии.

1

Лучше всего абстрагировать ваш код таким образом (обратите внимание, что ограничение является необязательным и по умолчанию равно 10):

print limit($string);


function limit($var, $limit=10)
{
    if ( strlen($var) > $limit )
    {
        return substr($string, 0, $limit) . '...';
    }
    else
    {
        return $var;
    }
}
  • 1
    Это не сработает, потому что trim () уже существует.
  • 0
    Могли бы объяснить, почему этот подход лучше, чем просто утверждать, что это так?
Показать ещё 3 комментария
0
$yourString = "bla blaaa bla blllla bla bla";
$out = "";
if(strlen($yourString) > 22) {
    while(strlen($yourString) > 22) {
        $pos = strrpos($yourString, " ");
        if($pos !== false && $pos <= 22) {
            $out = substr($yourString,0,$pos);
            break;
        } else {
            $yourString = substr($yourString,0,$pos);
            continue;
        }
    }
} else {
    $out = $yourString;
}
echo "Output String: ".$out;
0

это решение не будет вырезать слова, оно добавит три точки после первого места. Я редактировал решение @Raccoon29, и я заменил все функции функциями mb_, чтобы это работало для всех языков, таких как арабский

function cut_string($str, $n_chars, $crop_str = '...') {
    $buff = strip_tags($str);
    if (mb_strlen($buff) > $n_chars) {
        $cut_index = mb_strpos($buff, ' ', $n_chars);
        $buff = mb_substr($buff, 0, ($cut_index === false ? $n_chars : $cut_index + 1), "UTF-8") . $crop_str;
    }
    return $buff;
}
0

$width = 10;

$a = preg_replace ("~^(.{{$width}})(.+)~", '\\1…', $a);

или с wordwrap

$a = preg_replace ("~^(.{1,${width}}\b)(.+)~", '\\1…', $a);
0

substr() было бы лучше всего, вы также захотите сначала проверить длину строки

$str = 'someLongString';
$max = 7;

if(strlen($str) > $max) {
   $str = substr($str, 0, $max) . '...';
}

wordwrap не будет обрезать строку вниз, просто раздели ее...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню