Обрезать строку вниз - PullRequest
       10

Обрезать строку вниз

0 голосов
/ 05 июня 2009

Я пытаюсь сократить фрагмент текста до вокруг 30 символов. Если это короче, я хочу предыдущую строку. Кроме того, он имеет код в стиле форума. Я хочу выделить все в квадратных скобках ([])

Я использую пару функций для этого. forum_extract это то, что я называю.

function forum_extract($text) {
        return str_replace("\n",'<br />', limit_text(preg_replace('/\[[^\]]+\]/', '', $text), 30));
}

function limit_text($text, $limit) {
        if (strlen($text) <= $limit)
                return $text;

        $words = str_word_count($text, 2);
        $pos = array_keys($words);
        return substr($text, 0, $pos[$limit]) . '...';
}

Проблема возникает в limit_text, когда предоставленный $text короче, чем предел. Все, что я получаю, это "...".

Чтобы это произошло, он должен был пройти оговорку в limit_text. Но как?

Вот литерал, который передается в limit_text, но выглядит как "...":

Friend of ours paid 150€ the other day from Malaga. Spread across 4 people it didn't seem to bad, given it was a 8+ hour day for the driver, petrol etc.

Ответы [ 2 ]

2 голосов
/ 05 июня 2009

Я думаю, что проблема связана с вашим оператором $pos[$limit], так как он будет работать только в том случае, если $limit является одним из ключей, содержащихся в $pos, а $pos на самом деле является массивом на основе 0 числовых позиций соответствующие слова в вашей строке.

Давайте рассмотрим пример из руководства по PHP :

$str = "Hello fri3nd, you're
    looking          good today!";
$words = str_word_count($str, 2);
/*
 * Array
 * (
 *     [0] => Hello
 *     [6] => fri
 *     [10] => nd
 *     [14] => you're
 *     [29] => looking
 *     [46] => good
 *     [51] => today
 * )
 */

$pos = array_keys($words);
/*
 * Array
 * (
 *     [0] => 0
 *     [1] => 6
 *     [2] => 10
 *     [3] => 14
 *     [4] => 29
 *     [5] => 46
 *     [6] => 51
 * )
 */

Не протестировав следующий код, я бы попробовал:

function limit_text($text, $limit) {
    if (strlen($text) <= $limit) {
            return $text;
    }

    $words = str_word_count($text, 2);
    $cut_pos = strlen($text);
    foreach ($words as $pos => $word) {
        $end = $pos + strlen($word);
        if ($end > $limit) {
            $cut_pos = $end;
            break;
        }
    }
    return substr($text, 0, $cut_pos) . '...';
}
1 голос
/ 05 июня 2009

Последние три строки вашей функции limit_text неверны. Вы, вероятно, хотите отрезать на границе слова. Я бы позволил php сделать это, используя wordwrap():

$text = wordwrap($text, $limit - 3);
# Or a bit faster (depending on your average string size,
# wrapping 20kb of text could take some time):
# $text = wordwrap(substr($text, 0, $limit), $limit - 3);
if ($pos = (strpos($text, "\n"))) {
    $text = substr($text, 0, $pos);
}
return $text . '...';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...