Короткие тексты, PHP

Я получил эту функцию:

function shorter($text, $chars_limit) { if (strlen($text) > $chars_limit) return substr($text, 0, strrpos(substr($text, 0, $chars_limit), " ")).'...'; else return $text; } 

и если я использую echo shorter($input, 11) он работает нормально, но если на входе есть некоторые пробелы, в противном случае для ввода выглядит так:

wwwwwwwwwww

Функция изменит это на:

… (3 точки).

Я не хочу, чтобы это изменилось так:

www …

У вас есть идеи, как перестроить этот скрипт? Заранее спасибо.

Я предполагаю, что вы просто хотите принять вход. Если он длиннее X, то разрежьте его на X и добавьте «…».

 // Start function function shorter($text, $chars_limit) { // Check if length is larger than the character limit if (strlen($text) > $chars_limit) { // If so, cut the string at the character limit $new_text = substr($text, 0, $chars_limit); // Trim off white space $new_text = trim($new_text); // Add at end of text ... return $new_text . "..."; } // If not just return the text as is else { return $text; } } 

Я не тестировал это, но он должен работать. 🙂

Если вы ищете функцию, которая обрезает какой-либо фактический текст, вам, вероятно, понадобится безопасная функция UTF-8. Кроме того, если вы хотите аккуратно обрезать текст (обрезать текст только после буквенно-цифровых символов, без HTML и т. Д.), Вы можете попробовать эту функцию, я написал:

 /** * shortens the supplied text after last word * @param string $string * @param int $max_length * @param string $end_substitute text to append, for example "..." * @param boolean $html_linebreaks if LF entities should be converted to <br /> * @return string */ function mb_word_wrap($string, $max_length, $end_substitute = null, $html_linebreaks = true) { if($html_linebreaks) $string = preg_replace('/\<br(\s*)?\/?\>/i', "\n", $string); $string = strip_tags($string); //gets rid of the HTML if(empty($string) || mb_strlen($string) <= $max_length) { if($html_linebreaks) $string = nl2br($string); return $string; } if($end_substitute) $max_length -= mb_strlen($end_substitute, 'UTF-8'); $stack_count = 0; while($max_length > 0){ $char = mb_substr($string, --$max_length, 1, 'UTF-8'); if(preg_match('#[^\p{L}\p{N}]#iu', $char)) $stack_count++; //only alnum characters elseif($stack_count > 0) { $max_length++; break; } } $string = mb_substr($string, 0, $max_length, 'UTF-8').$end_substitute; if($html_linebreaks) $string = nl2br($string); return $string; } 

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

 function shorter($text, $chars_limit) { if (strlen($text) > $chars_limit) { $rpos = strrpos(substr($text, 0, $chars_limit), " "); if ($rpos!==false) { // if there's whitespace, cut off at last whitespace return substr($text, 0, $rpos).'...'; }else{ // otherwise, just cut after $chars_limit chars return substr($text, 0, $chars_limit).'...'; } } else { return $text; } } 
 function shorter($input, $length) { //no need to trim, already shorter than trim length if (strlen($input) <= $length) { return $input; } //find last space within length $last_space = strrpos(substr($input, 0, $length), ' '); if(!$last_space) $last_space = $length; $trimmed_text = substr($input, 0, $last_space); //add ellipses (...) $trimmed_text .= '...'; return $trimmed_text; }