Отримайте перші п символів рядка


320

Як я можу отримати перші n символів рядка в PHP? Який найшвидший спосіб обрізати рядок до певної кількості символів та додати "...", якщо потрібно?


5
можливо, буде краще використовувати символ еліпсису…
Кіт

1
ознайомтеся з моєю відповіддю, якщо вам потрібно уникати різання слів.
TechNyquist


Спробуйте це посилання, може допомогти вам ... stackoverflow.com/a/26098951/3944217
edCoder

Відповіді:


577
//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 крапки (...)
Кіт

3
Мені це подобається, але я змінив його і використовую наступне, щоб видалити пробіл в кінці: $ string = substr (обробка ($ string), 0,10) .'... '; Таким чином ви отримуєте щось на кшталт "Мені подобається ..." замість "Мені подобається ...".
Кентон де Йонг

28
"hellip" - мені довелося колись зрозуміти, що ми не говоримо про IP-адресу сатани
Лукас Бернардо де Суса

2
Оновлення 3 є найбільш корисним.
мілковський

У випадку, якщо на довжині повернутого рядка є жорстке обмеження, чи не повинен бути рядок 5 оновлення 3 $string = wordwrap($string, $length - sizeof($append)); ?
Майкл Креншо

114

Ця функціональність вбудована в PHP з версії 4.0.6. Дивіться документи .

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

// outputs Hello W...

Зауважимо, що trimmarker(еліпси вище) включені в усічену довжину.


4
Для мене прекрасно працювали. Топ відповіді не спрацював, і я радий, що це не сталося, тому що продовжував прокручувати і знайшов цей дорогоцінний камінь.
Едуардо

Дякую, я завжди використовував цей довший і старший метод!
гр3г

1
Ден, ти, можливо, захочеш трохи уточнити, яка частина верхньої відповіді не працює для тебе. Функція усікання () прекрасно працювала для мене, і перевага цієї відповіді над відповіддю Брюховського полягає в тому, що вона розбивається на межі слова; припускаючи, що ви дбаєте про таку річ.
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>, а коли я його пов'язую, він пов'язуватиме його разом із трьома крапками, які будуть надходити як інше значення.
привіт

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

}

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.


8

Рамка кодарінтера містить помічник для цього, який називається "текстовий помічник". Ось деяка документація із посібника користувача 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
Цей код завжди додаватиме ... до рядка, якого він не хотів.
TravisO

Ви абсолютно праві, і я відповідним чином відредагував відповідь. (Переглянута відповідь, яка зараз чекає експертної оцінки)
Chaya Cooper

3
if(strlen($text) > 10)
     $text = substr($text,0,10) . "...";

З @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 рядок для маніпуляції.


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

Краще абстрагувати такий код, як ви так (зауважте, що ліміт є необов’язковим і за замовчуванням до 10):

print limit($string);


function limit($var, $limit=10)
{
    if ( strlen($var) > $limit )
    {
        return substr($string, 0, $limit) . '...';
    }
    else
    {
        return $var;
    }
}

1
Це не спрацює, оскільки обробка () вже існує.
Гордон

Чи можете ви пояснити, чому такий підхід найкраще замість того, щоб просто стверджувати, що він є?
Роберт

1
@Robert це просто, а абстрагування означає, що вам не доведеться повторно вводити код знову і знову. І найголовніше, якщо ви знайдете кращий спосіб зробити це або хочете щось складніше, ви зміните лише цю 1 функцію замість 50 штук коду.
TravisO

2
Чому функція велика?
Карло

Виправлення: substr $ var, а не $ string. Тестуйте на $limit + 3те, щоб ви не обрізали рядок трохи більше межі. Залежно від вашої програми (наприклад, вихід HTML), &hellip;замість цього використовуйте сутність (типографічно приємніше). Як було запропоновано раніше, обріжте будь-які не букви від кінця (укороченого) рядка, перш ніж додавати еліпсис. Нарешті, слідкуйте, чи перебуваєте ви в багатобайтовому (наприклад, UTF-8) середовищі - ви не можете використовувати strlen () та substr ().
Філ Перрі


0

substr () було б найкраще, ви також хочете спочатку перевірити довжину рядка

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

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

перетворення слів не обріже рядок, просто розділить її ...


0

$ ширина = 10;

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

або із загортанням слів

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

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
$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

Якщо немає жодної жорсткої вимоги щодо довжини усіченої рядка, можна використовувати це для усічення та запобігання вирізання останнього слова:

$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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.