Подтвердить что ты не робот

Получите первые 100 символов из строки, соблюдая полные слова

Я задал аналогичный вопрос здесь раньше, но мне нужно знать, возможна ли эта небольшая настройка. Я хочу сократить строку до 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);

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

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

4b9b3361

Ответ 1

Все, что вам нужно сделать, это использовать:

$pos=strpos($content, ' ', 200);
substr($content,0,$pos ); 

Ответ 2

Да, есть. Это функция, которую я заимствовал у пользователя на разных форумах несколько лет назад, поэтому я не могу воспользоваться этим.

//truncate a string only at a whitespace (by nogdog)
function truncate($text, $length) {
   $length = abs((int)$length);
   if(strlen($text) > $length) {
      $text = preg_replace("/^(.{1,$length})(\s.*|$)/s", '\\1...', $text);
   }
   return($text);
}

Обратите внимание, что он автоматически добавляет эллипсы, если вы не хотите, чтобы просто использовать '\\1' в качестве второго параметра для вызова preg_replace.

Ответ 3

Если вы определяете слова как "последовательности символов, разделенных пробелом"... Используйте strrpos(), чтобы найти последнее место в строке, укоротите это положение, обрезайте результат.

Ответ 4

Конечно. Самый простой способ - написать обертку вокруг preg_match:

function limitString($string, $limit = 100) {
    // Return early if the string is already shorter than the limit
    if(strlen($string) < $limit) {return $string;}

    $regex = "/(.{1,$limit})\b/";
    preg_match($regex, $string, $matches);
    return $matches[1];
}

EDIT: Обновлено, чтобы не ВСЕГДА включать пробел в качестве последнего символа в строке

Ответ 5

Эта функция сокращает строку, добавляя "..." на границе слова, когда это возможно. Возвращаемая строка будет иметь максимальную длину $len, включая "...".

function truncate($str, $len) {
  $tail = max(0, $len-10);
  $trunk = substr($str, 0, $tail);
  $trunk .= strrev(preg_replace('~^..+?[\s,:]\b|^...~', '...', strrev(substr($str, $tail, $len-$tail))));
  return $trunk;
}

Примеры выходов:

  • truncate("Thanks for contributing an answer to Stack Overflow!", 15)
    возвращает "Thanks for..."
  • truncate("To learn more, see our tips on writing great answers.", 15)
    возвращает "To learn more..." (запятая также усечена)
  • truncate("Pseudopseudohypoparathyroidism", 15)
    возвращает "Pseudopseudo..."

Ответ 6

Это мой подход, основанный на ответе амира, но он не позволяет ни одному слову сделать строку длиннее предела, используя strrpos() с отрицательным смещением.

Простой, но работает. Я использую тот же синтаксис, что и в вспомогательной функции Laravel str_limit(), если вы хотите использовать его в проекте, отличном от Laravel.

function str_limit($value, $limit = 100, $end = '...')
{
    $limit = $limit - mb_strlen($end); // Take into account $end string into the limit
    $valuelen = mb_strlen($value);
    return $limit < $valuelen ? mb_substr($value, 0, mb_strrpos($value, ' ', $limit - $valuelen)) . $end : $value;
}

Ответ 7

Это отлично работает для меня, я использую его в своем script

<?PHP
$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;

function some_function($string){
     $string = substr($string,0,100);
     $string = substr($string,0,strrpos($string," "));
     return $string;
}
?>

удача

Ответ 8

Вот отличное решение с точками в конце с полными словами

function text_cut($text, $length = 200, $dots = true) {
    $text = trim(preg_replace('#[\s\n\r\t]{2,}#', ' ', $text));
    $text_temp = $text;
    while (substr($text, $length, 1) != " ") { $length++; if ($length > strlen($text)) { break; } }
    $text = substr($text, 0, $length);
    return $text . ( ( $dots == true && $text != '' && strlen($text_temp) > $length ) ? '...' : ''); 
}

Input: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud, осуществляющий работу, выполняемый в соответствии с потребностями. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat не имеет отношения к делу, загорается в culpa qui officia deserunt mollit anim id est laborum.

Вывод: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud Упражнение ullamco labis nisi ut aliquip...

Ответ 9

Это сделало это для меня...

//trim message to 100 characters, regardless of where it cuts off
$msgTrimmed = mb_substr($var,0,100);

//find the index of the last space in the trimmed message
$lastSpace = strrpos($msgTrimmed, ' ', 0);

//now trim the message at the last space so we don't cut it off in the middle of a word
echo mb_substr($msgTrimmed,0,$lastSpace)

Ответ 10

Здесь мое решение:

/**
 * 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);

Ответ 11

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) "Первая"

Ответ 12

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

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

Ответ 13

Вот еще один способ, которым вы можете это сделать.

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

ИЛИ

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

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

Ответ 14

Проблема с принятым ответом заключается в том, что строка результата проходит через предел, т.е. может превышать 100 символов, поскольку strpos будет выглядеть после смещения, и поэтому ваша длина всегда будет за пределами вашей предел. Если последнее слово длинное, например squirreled, тогда длина вашего результата будет 111 (чтобы дать вам идею).

Лучшим решением является использование функции wordwrap:

function truncate($str, $length = 125, $append = '...') {
    if (strlen($str) > $length) {
        $delim = "~\n~";
        $str = substr($str, 0, strpos(wordwrap($str, $length, $delim), $delim)) . $append;
    } 

    return $str;
}


echo truncate("The quick brown fox jumped over the lazy dog.", 5);

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

P.S. Это особенно полезно, если вы планируете хранить укороченную строку в своей базе данных с фиксированным столбцом типа VARCHAR (50) и т.д.

P.P.S. Обратите внимание на специальный разделитель в wordwrap. Это делается для того, чтобы ваша строка была усечена правильно, даже если она содержит символы новой строки (в противном случае она будет усекаться при первой новой строке, которую вы не хотите).

Ответ 15

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

list ($ short) = explode ( "\n", wordwrap ($ 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) ""

Ответ 16

Еще один ответ! Я не был полностью доволен другими ответами и хотел "жесткого отсечения" (гарантированный разрыв слов до $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;
}

Ответ 17

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

<?php 
  $content= $row->title;
  $result = substr($content, 0, 70);
  echo $result; 
  ?>