Обрезать блок текста до ближайшего слова, когда достигнут определенный предел символов? - PullRequest
1 голос
/ 02 апреля 2009

Вот вопрос: как бы вы обрезали блок текста до ближайшего слова, когда прошло определенное количество символов. Я не пытаюсь ограничить определенное количество слов или букв, но ограничиваю буквы и обрезаю их на ближайшем слове.

Скажем, у меня было две строки:

"This is a block of text, blah blah blah"
"this is another block of txt 2 work with"

Скажем, я хотел ограничить его 27 символами, первая строка заканчивалась бы на "бла", а вторая включалась на "txt", даже если в этих словах были достигнуты пределы символов.

Есть ли какое-нибудь чистое решение этой проблемы?

Ответы [ 6 ]

2 голосов
/ 02 апреля 2009

См. Функцию wordwrap .

Я бы, наверное, сделал что-то вроде:

function wrap($string) {
  $wstring = explode("\n", wordwrap($string, 27, "\n") );
  return $wstring[0];
}

(Если ваши строки уже перекрывают строгие строки, используйте другой символ - или шаблон - для разделения, отличного от "\ n")

1 голос
/ 02 апреля 2009

Я написал max-string-length функцию, которая делает именно это и очень чистая.

0 голосов
/ 09 декабря 2010
// Trim very long text to 120 characters. Add an ellipsis if the text is trimmed.
if(strlen($very_long_text) > 120) {
  $matches = array();
  preg_match("/^(.{1,120})[\s]/i", $very_long_text, $matches);
  $trimmed_text = $matches[0]. '...';
}
0 голосов
/ 02 апреля 2009

Вы можете использовать малоизвестный модификатор str_word_count, чтобы помочь сделать это. Если вы передадите параметр '2', он вернет массив, в котором находится позиция слова.

Ниже приведен простой способ использования этого, но может быть возможно сделать это более эффективно:

$str = 'This is a string with a few words in';
$limit = 20;
$ending = $limit;

$words = str_word_count($str, 2);

foreach($words as $pos=>$word) {
    if($pos+strlen($word)<$limit) {
        $ending=$pos+strlen($word);
    }
    else{
        break;
    }
}

echo substr($str, 0, $ending);
// outputs 'this is a string'
0 голосов
/ 02 апреля 2009

Я думаю, что это должно сработать:

function trimToWord($string, $length, $delimiter = '...')
{
    $string        = str_replace("\n","",$string);
    $string        = str_replace("\r","",$string);
    $string        = strip_tags($string);
    $currentLength = strlen($string);

    if($currentLength > $length)
    {
        preg_match('/(.{' . $length . '}.*?)\b/', $string, $matches);

        return rtrim($matches[1]) . $delimiter;
    }
    else 
    {
        return $string;
    }
}
0 голосов
/ 02 апреля 2009

Не проще ли объединить строки с помощью заполнителя (например: ### PLACEHOLDER ###), посчитать символы строки без вашего заполнителя, обрезать ее до нужной длины с помощью substr, а затем взорваться заполнителем?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...