Получите первые 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?

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

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

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

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

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

Конечно. Проще всего, наверное, написать обертку вокруг 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: Обновлено, чтобы не ВСЕГДА включать пробел в качестве последнего символа в строке

Эта функция сокращает строку, добавляя "..." на границе слова, когда это возможно. Возвращаемая строка будет иметь максимальную длину $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..."

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

Простой, но работает. Я использую тот же синтаксис, что и в вспомогательной функции str_limit () Laravel, в случае, если вы хотите использовать его в проекте, отличном от 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; } 

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

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

удачи

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

 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 ) ? '...' : ''); } 

Вход: 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 не имеет отношения к делу, sunt in 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 …

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

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

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

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

строка (9) «Первая»

 print truncate('FirstStepToEternalLife', 5); 

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

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

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

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

 $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 символов, а затем выполняет поиск с конца до ближайшего разделителя слов.

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

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

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

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

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

list ($ short) = explode ("\ n", wordwrap ($ ali, 50));

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

здесь прогон образца

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

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

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

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