Получить первые 100 символов из строки, соблюдая полные слова - PullRequest
64 голосов
/ 09 июня 2009

Я уже задавал подобный вопрос здесь раньше, но мне нужно знать, возможен ли этот маленький твик. Я хочу сократить строку до 100 символов и использовать $small = substr($big, 0, 100); для этого. Однако, это просто берет первые 100 символов и не заботится, разбивает ли это слово или нет.

Есть ли способ взять до первых 100 символов строки, но убедитесь, что вы не разбили слово?

Пример:

$big = "This is a sentence that has more than 100 characters in it, and I want to return a string of only full words that is no more than 100 characters!"

$small = some_function($big);

echo $small;

// OUTPUT: "This is a sentence that has more than 100 characters in it, and I want to return a string of only"

Есть ли способ сделать это с помощью PHP?

Ответы [ 18 ]

2 голосов
/ 10 октября 2013

Вот мое решение:

/**
 * get_words_until() Returns a string of delimited text parts up to a certain length
 * If the "words" are too long to limit, it just slices em up to the limit with an ellipsis "..."
 *
 * @param $paragraph - The text you want to Parse
 * @param $limit - The maximum character length, e.g. 160 chars for SMS
 * @param string $delimiter - Use ' ' for words and '. ' for sentences (abbreviation bug) :)
 * @param null $ellipsis - Use '...' or ' (more)' - Still respects character limit
 *
 * @return string
 */
function get_words_until($paragraph, $limit, $delimiter = ' ', $ellipsis = null)
{
    $parts = explode($delimiter, $paragraph);

    $preview = "";

    if ($ellipsis) {
        $limit = $limit - strlen($ellipsis);
    }

    foreach ($parts as $part) {
        $to_add = $part . $delimiter;
        if (strlen($preview . trim($to_add)) <= $limit) { // Can the part fit?
            $preview .= $to_add;
            continue;
        }
        if (!strlen($preview)) { // Is preview blank?
            $preview = substr($part, 0, $limit - 3) . '...'; // Forced ellipsis
            break;
        }
    }

    return trim($preview) . $ellipsis;
}

В вашем случае это будет (пример):

$big = "This is a sentence that has more than 100 characters in it, and I want to return a string of only full words that is no more than 100 characters!"

$small = get_words_until($big, 100);
2 голосов
/ 29 сентября 2015
function truncate ($str, $length) {
    if (strlen($str) > $length) {
        $str = substr($str, 0, $length+1);
        $pos = strrpos($str, ' ');
        $str = substr($str, 0, ($pos > 0)? $pos : $length);
    }
    return $str;
}

Пример:

print truncate('The first step to eternal life is you have to die.', 25);

string (25) "Первый шаг в вечность"

print truncate('The first step to eternal life is you have to die.', 12);

string (9) "Первый"

print truncate('FirstStepToEternalLife', 5);

строка (5) «Первый»

1 голос
/ 30 апреля 2018

Еще один более простой способ, которым я занимаюсь.

function limit_words($string, $word_limit = 10)
{
    $words = explode(" ", $string);
    if (count($words) > $word_limit) {
        return implode(" ", array_splice($words, 0, $word_limit)) . ' ...';
    }
    return implode(" ", array_splice($words, 0, $word_limit));
}
1 голос
/ 14 октября 2014

Я прошу прощения за воскрешение этого вопроса, но я наткнулся на эту тему и обнаружил небольшую проблему. Для тех, кто хочет ограничить количество символов, которые уберут слова, которые превышают заданный лимит, вышеприведенные ответы отлично подойдут. В моем конкретном случае мне нравится отображать слово, если лимит находится в середине указанного слова. Я решил поделиться своим решением на тот случай, если кому-то еще нужна эта функциональность и ему нужно добавить слова вместо того, чтобы их обрезать.

function str_limit($str, $len = 100, $end = '...')
{
    if(strlen($str) < $len)
    {
        return $str;
    }

    $str = preg_replace("/\s+/", ' ', str_replace(array("\r\n", "\r", "\n"), ' ', $str));

    if(strlen($str) <= $len)
    {
        return $str;
    }

    $out = '';
    foreach(explode(' ', trim($str)) as $val)
    {
        $out .= $val . ' ';

        if(strlen($out) >= $len)
        {
            $out = trim($out);
            return (strlen($out) == strlen($str)) ? $out : $out . $end;
        }
    }
}

Примеры:

  • Ввод: echo str_limit('Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.', 100, '...');
  • Выход: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore...
  • Ввод: echo str_limit('Lorem ipsum', 100, '...');
  • Выход: Lorem ipsum
  • Ввод: echo str_limit('Lorem ipsum', 1, '...');
  • Выход: Lorem...
1 голос
/ 22 июля 2015

Вот еще один способ сделать это.

$big = "This is a sentence that has more than 100 characters in it, and I want to return a string of only full words that is no more than 100 characters!"
$big = trim( $big );
$small = $big;
                if( strlen( $big ) > 100 ){
                $small = mb_substr( $small, 0, 100 );
                $last_position = mb_strripos( $small, ' ' );
                    if( $last_position > 0 ){
                    $small = mb_substr( $small, 0, $last_position );
                    }
                }

            echo $small; 

OR

 echo ( strlen( $small ) <  strlen( $big ) ? $small.'...' : $small );

Это также многобайтовый сейф и работает, даже если нет пробелов, в этом случае он просто вернет первые 100 символов. Он занимает первые 100 символов, а затем выполняет поиск от конца до ближайшего разделителя слов.

0 голосов
/ 23 сентября 2016

## Получить первый ограниченный символ из строки ##

<?php 
  $content= $row->title;
  $result = substr($content, 0, 70);
  echo $result; 
  ?>
0 голосов
/ 13 сентября 2016

Еще один ответ! Я не был полностью удовлетворен другими ответами и хотел «жесткое сокращение» (гарантированный разрыв слова перед $ max_characters, если это возможно), поэтому вот моя функция - внести свой вклад!

/**
 * Shortens a string (if necessary), trying for a non-word character before character limit, adds an ellipsis and
 * returns. Falls back to a forced cut if no non-word characters exist before.
 *
 * @param string $content
 * @param int    $max_characters - number of characters to start looking for a space / break.
 * @param bool   $add_ellipsis   - add ellipsis if content is shortened
 *
 * @return string
 */
public static function shorten( $content, $max_characters = 100, $add_ellipsis = TRUE ) {
    if ( strlen( $content ) <= $max_characters ) {
        return $content;
    }

    // search for non-word characters
    $match_count = preg_match_all( '/\W/', $content, $matches, PREG_OFFSET_CAPTURE );

    // force a hard break if can't find another good solution
    $pos = $max_characters;

    if ( $match_count > 0 ) {
        foreach ( $matches[0] as $match ) {
            // check if new position fits within
            if ( $match[1] <= $max_characters ) {
                $pos = $match[1];
            } else {
                break;
            }
        }
    }

    $suffix = ( $add_ellipsis ) ? '&hellip;' : '';

    return substr( $content, 0, $pos ) . $suffix;
}
0 голосов
/ 22 октября 2010

wordwrap форматирует строку в соответствии с лимитом, разделяет их \ n поэтому у нас есть строки меньше 50, орды не разделены взрывает разделяет строку в соответствии с \ n поэтому у нас есть массив, соответствующий строкам список собирает первый элемент.

list ($ short) = взорваться ("\ n", перенос слов ($ ali, 50));

пожалуйста, повтор Evert , так как я не могу комментировать или повтор.

вот примерный прогон

php >  $ali = "ali veli krbin yz doksan esikesiksld sjkas laksjald lksjd asldkjadlkajsdlakjlksjdlkaj aslkdj alkdjs akdljsalkdj ";
php > list($short) = explode("\n",wordwrap($ali ,50));
php > var_dump($short);
string(42) "ali veli krbin yz doksan esikesiksld sjkas"
php > $ali ='';
php > list($short) = explode("\n",wordwrap($ali ,50));
php > var_dump($short);
string(0) ""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...