PHP строка / текстовый вопрос - PullRequest
6 голосов
/ 26 августа 2009

Допустим, у меня есть следующее предложение:

A quick brown fox jumped over a lazy dog.

Однако у меня есть ограничение: в этом предложении может быть разрешено только 25 символов. Это может оставить меня с чем-то вроде:

A quick brown fox jum

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

A quick brown fox

Который будет меньше предела в 25 символов, однако он имеет более грамматический смысл. То есть слово не разбито, у нас есть максимальное количество понятных слов, оставаясь в пределе.

Как я могу кодировать функцию, которая будет принимать строку и предел символа, например 25, и, если строка превышает предел, возвращает строку с максимально возможным числом слов?

Ответы [ 3 ]

12 голосов
/ 26 августа 2009

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

function first_few_words($text, $limit) {
    // grab one extra letter - it might be a space
    $text = substr($text, 0, $limit + 1);
    // take off non-word characters + part of word at end
    $text = preg_replace('/[^a-z0-9_\-]+[a-z0-9_\-]*\z/i', '', $text);
    return $text;
}

echo first_few_words("The quick brown fox jumps over the lazy dog", 25);

Некоторые дополнительные функции этой реализации:

  • Разделяет слова на переносах строк и на вкладках.
  • Сохраняет дополнительное слово, которое заканчивается на символе 25.

Редактировать: изменено регулярное выражение, чтобы только буквы, цифры, '_' и '-' считались символами слов.

2 голосов
/ 26 августа 2009
<?php
    function wordwrap_explode($str, $chars)
    {
        $code = '@@@';
        return array_shift(explode($code, wordwrap($str, $chars, $code)));
    }
    echo wordwrap_explode('A quick brown fox jumped over a lazy dog.', 25);
?>

Выход:

A quick brown fox jumped
0 голосов
/ 26 августа 2009

Вы не можете попробовать адаптировать эту функцию. Я взял идею с сайта php и адаптировал ее под свои нужды. Он берет «голову» и «хвост» строки и сокращает строку (учитывая слова) до заданной длины. Для ваших нужд может быть неплохо убрать всю «хвостовую» часть функции.

function strMiddleReduceWordSensitive ($string, $max = 50, $rep = ' [...] ') {
$string=nl2space(utf8decode($string));
$strlen = mb_strlen ($string);

if ($strlen <= $max)
   return $string;

$lengthtokeep = $max - mb_strlen($rep);
$start = 0;
$end = 0;

if (($lengthtokeep % 2) == 0) {
   $length = $lengthtokeep / 2;
   $end = $start;
} else {
   $length = intval($lengthtokeep / 2);
   $end = $start + 1;
}
$tempHead = mb_strcut($string, 0, $length);
$headEnd = strrpos($tempHead, ' ')+1;
$head = trim(mb_strcut($tempHead, 0, $headEnd));

$tempTail = mb_strcut($string, -$length);
$tailStart = strpos($tempTail, ' ')+1;
$tail = trim(mb_strcut($tempTail, $tailStart));
//p($head);
//p($tail);
return $head . $rep . $tail;

}

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