php обрезать строку

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

Вот что я имею:

function trim_me($s,$max) { if (strlen($s) > $max) { $s = substr($s, 0, $max - 3) . '...'; } return $s; } 

Вышеуказанная строка обрезает строку, если она больше, чем $max и добавит продолжение ...

Я хочу расширить эту функцию для обработки нескольких слов. В настоящее время он делает то, что он делает, но если у меня есть строка, скажите: How are you today? длиной 18 символов. Если я запустил trim_me($s,10) он будет отображаться как How are yo... , что не эстетично. Как я могу это сделать, чтобы он добавил ... после целого слова. Скажем, если я запустил trim_me($s,10) я хочу, чтобы он отображался. How are you... добавляете продолжение ПОСЛЕ слова. Есть идеи?

Я почти не хочу добавлять продолжение в середине слова. Но если строка имеет только одно слово, то продолжение может сломать только слово.

Итак, вот что вы хотите:

 <?php // Original PHP code by Chirp Internet: www.chirp.com.au // Please acknowledge use of this code by including this header. function myTruncate($string, $limit, $break=".", $pad="...") { // is $break present between $limit and the end of the string? if(false !== ($breakpoint = strpos($string, $break, $limit))) { if($breakpoint < strlen($string) - 1) { $string = substr($string, 0, $breakpoint) . $pad; } } return $string; } ?> 

Кроме того, вы можете прочитать больше на http://www.the-art-of-web.com/php/truncate/

 function trim_me($s,$max) { if( strlen($s) <= $max) return $s; return substr($s,0,strrpos($s," ",$max-3))."..."; } 

strrpos – это функция, которая делает магию.

Я назвал функцию str_trunc . Вы можете указать строгое TRUE, и в этом случае он будет содержать только строку с максимальным размером и не более, иначе он будет искать самую короткую строку, соответствующую слову, которое он должен был закончить.

 var_dump(str_trunc('How are you today?', 10)); // string(10) "How are..." var_dump(str_trunc('How are you today? ', 10, FALSE)); // string(14) "How are you..." // Returns a trunctated version of $str up to $max chars, excluding $trunc. // $strict = FALSE will allow longer strings to fit the last word. function str_trunc($str, $max, $strict = TRUE, $trunc = '...') { if ( strlen($str) <= $max ) { return $str; } else { if ($strict) { return substr( $str, 0, strrposlimit($str, ' ', 0, $max + 1) ) . $trunc; } else { return substr( $str, 0, strpos($str, ' ', $max) ) . $trunc; } } } // Works like strrpos, but allows a limit function strrposlimit($haystack, $needle, $offset = 0, $limit = NULL) { if ($limit === NULL) { return strrpos($haystack, $needle, $offset); } else { $search = substr($haystack, $offset, $limit); return strrpos($search, $needle, 0); } } 

Это на самом деле как-то просто, и я добавляю этот ответ, потому что предлагаемый дубликат не соответствует вашим потребностям (но он дает некоторые указатели).

Вы хотите вырезать строку максимальной длины, но сохранить последнее слово. Поэтому вам нужно выяснить положение, где нужно вырезать строку (и если на самом деле необходимо ее вообще разрезать).

Поскольку получение длины ( strlen ) и сокращение строки ( substr ) не является вашей проблемой (вы уже используете ее), проблема заключается в том, как получить позицию последнего слова, которое находится в пределах лимита.

Это включает в себя анализ строки и выяснение смещений каждого слова. Обработка строк может выполняться с помощью регулярных выражений. При написании этого, это напоминает мне о некоторых более похожих вопросах, где это уже было решено:

  • Извлеките фиксированное количество символов из массива, только полные слова (с регулярным выражением)
  • Как получить первые х символов из строки, не отрезая последнее слово? (со wordwrap )

Он выполняет именно это: получение строки «full words» с использованием регулярного выражения. Единственное отличие состоит в том, что он удаляет последнее слово (вместо его расширения). Поскольку вы хотите расширить последнее слово вместо этого, для этого требуется другой шаблон регулярного выражения.

В регулярном выражении \b соответствует границе слова. Это до или после слова. Теперь вы хотите выбрать символы не менее $length до следующей границы слова.

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

Вы можете расширить свою функцию следующим образом: регулярный шаблон выражения ( preg_replace ) и trim :

 /** * Cut a string at length while preserving the last word. * * @param string $str * @param int $length * @param string $suffix (optional) */ function trim_word($str, $length, $suffix = '...') { $len = strlen($str); if ($len < $length) return $str; $pattern = sprintf('/^(.{%d,}?)\b.*$/', $length); $str = preg_replace($pattern, '$1', $str); $str = trim($str); $str .= $suffix; return $str; } 

Применение:

 $str = 'How are you today?'; echo trim_word($str, 10); # How are you... 

Вы также можете расширить это, уменьшив минимальную длину в шаблоне по длине суффикса (поскольку это как-то предлагается в вашем вопросе, однако результаты, которые вы дали в своем вопросе, не совпадали с вашим кодом).

Надеюсь, это полезно. Также, пожалуйста, используйте функцию поиска на этом сайте, это не идеально, но многие драгоценные камни скрыты в существующих вопросах альтернативных подходов.