Краткий текст, PHP - PullRequest
       9

Краткий текст, PHP

5 голосов
/ 08 сентября 2011

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

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

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

Ответы [ 4 ]

11 голосов
/ 08 сентября 2011

Я предполагаю, что вы просто хотите принять участие.Если он длиннее 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;
    }
}

Я не проверял это, но он должен работать.:)

3 голосов
/ 08 сентября 2011

Если вы ищете функцию, которая обрезает некоторый фактический текст, вам, вероятно, понадобится безопасная функция 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;
}
1 голос
/ 08 сентября 2011
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;
}
1 голос
/ 08 сентября 2011

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

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