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

320

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

Alex
источник
5
может быть лучше использовать символ многоточия ...
Кит
1
проверьте мой ответ, если вам нужно избежать сокращения слов.
TechNyquist
Попробуйте эту ссылку, может помочь вам ... stackoverflow.com/a/26098951/3944217
edCoder

Ответы:

578
//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;
}
Брендан Буллен
источник
11
может быть лучше заменить многоточием (…), а не 3 точками (...)
Keet
3
Я люблю это, но я изменил его и использую следующее, чтобы удалить пробелы в конце: $ string = substr (trim ($ string), 0,10) .'... '; Таким образом, вы получите что-то вроде «мне нравится ...» вместо «мне нравится ...».
Кентон де Йонг
28
"hellip" - мне понадобилось время, чтобы понять, что мы не говорим о IP-адресе сатаны
Лукас Бернардо де Соуза
2
Обновление 3 является наиболее полезным.
Мильковский
В случае жесткого ограничения длины возвращаемой строки, разве не должна быть строка 5 обновления 3 $string = wordwrap($string, $length - sizeof($append)); ?
Майкл Креншоу
115

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

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

// outputs Hello W...

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

bruchowski
источник
4
Работал отлично для меня. Верхний ответ не сработал, и я рад, что не сработал, потому что продолжал прокручивать и нашел этот драгоценный камень.
Эдуардо
Спасибо, я всегда использовал этот более длинный и старый метод!
gr3g
1
Дэн, ты мог бы хотеть быть более конкретным о том, какая часть топ-ответа тебе не подходит. Функция truncate () отлично сработала для меня, и преимущество этого ответа перед ответом Бруховского состоит в том, что оно ломается по границам слова; при условии, что вы заботитесь о таких вещах.
pdwalker
2
хороший улов! многие опытные разработчики PHP не знают об этой функции :)
jroi_web
1
Верхний (прямо сейчас) ответ ( stackoverflow.com/a/3161830/236306 ) ничего не сделал (как будто я вообще не использовал fn). Не знаю почему. Этот ответ, однако, кажется идеальным и пришел с дополнительным преимуществом работы.
Алан
15

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

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

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

Например: нам нужно ограничить «Это моя строка» до 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;
    }

}
MortalViews
источник
9

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

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.

TechNyquist
источник
8

Платформа 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) . "...";
Dlongnecker
источник
3
Этот код всегда будет добавлять ... в строку, которую он не хотел.
TravisO
Вы абсолютно правы, и я соответственно отредактировал ответ. (Пересмотренный ответ в настоящее время ожидает ТАК рецензирования)
Chaya Cooper
3
if(strlen($text) > 10)
     $text = substr($text,0,10) . "...";
HCL
источник
От @Brendon Bullen выше .. $ string = (strlen ($ string)> 13)? substr ($ string, 0,10) .'... ': $ string; Ницца !
MarcoZen
1

Функция, которую я использовал:

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

Посмотрите это в действии .

Бенджамин Крузье
источник
1

Вот что я делаю

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

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

christoz
источник
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);
это обрежет вашу строку и добавит "..." в конце
:)

Saikelu
источник
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, '..');
TFont
источник
1

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

print limit($string);


function limit($var, $limit=10)
{
    if ( strlen($var) > $limit )
    {
        return substr($string, 0, $limit) . '...';
    }
    else
    {
        return $var;
    }
}
TravisO
источник
1
Это не сработает, потому что trim () уже существует.
Гордон
Могли бы объяснить, почему этот подход лучше, чем просто утверждать, что это так?
Роберт
1
@ Роберт, это просто, и абстрагирование означает, что вам не нужно снова и снова печатать код. И самое главное, если вы найдете лучший способ сделать это или хотите что-то более сложное, вы просто измените эту функцию 1 вместо 50 фрагментов кода.
TravisO
2
Почему функция прописная?
Карло
Исправлено: субстрат $ var, а не $ string. Проверьте, $limit + 3чтобы не обрезать строку только за предел. В зависимости от вашего приложения (например, вывод HTML), рассмотрите возможность использования объекта &hellip;(типографски более приятным). Как предлагалось ранее, обрежьте все не-буквы с конца (укороченной) строки перед добавлением многоточия. Наконец, следите, если вы находитесь в многобайтовой (например, UTF-8) среде - вы не можете использовать strlen () и substr ().
Фил Перри
1

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

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

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

Сергей Соколенко
источник
0

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

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

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

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

tsgrasser
источник
0

ширина = 10;

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

или с переносом слов

$a = preg_replace ("~^(.{1,${width}}\b)(.+)~", '\\1…', $a);
akond
источник
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;
}
Waqleh
источник
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;
Jaykishan
источник
0

Если нет строгих требований к длине усеченной строки, это можно использовать для усечения и предотвращения сокращения последнего слова:

$text = "Knowledge is a natural right of every human being of which no one
has the right to deprive him or her under any pretext, except in a case where a
person does something which deprives him or her of that right. It is mere
stupidity to leave its benefits to certain individuals and teams who monopolize
these while the masses provide the facilities and pay the expenses for the
establishment of public sports.";

// we don't want new lines in our preview
$text_only_spaces = preg_replace('/\s+/', ' ', $text);

// truncates the text
$text_truncated = mb_substr($text_only_spaces, 0, mb_strpos($text_only_spaces, " ", 50));

// prevents last word truncation
$preview = trim(mb_substr($text_truncated, 0, mb_strrpos($text_truncated, " ")));

В этом случае $previewбудет "Knowledge is a natural right of every human being".

Пример прямого кода: http://sandbox.onlinephpfunctions.com/code/25484a8b687d1f5ad93f62082b6379662a6b4713

jim_kastrin
источник