修剪一个字符串

时间:2009-06-05 11:21:29

标签: php

我正在尝试将一大块文本剪切到大约 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中的guard-clause。但是如何?

这是一个传递到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 个答案:

答案 0 :(得分:2)

我认为问题与您的$pos[$limit]声明有关,因为只有当$limit$pos中包含的密钥之一且$pos实际为0时,此问题才有效基于字符串的相应单词的数字位置数组。

让我们看看PHP manual

中的示例
$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 :(得分:1)

您的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 . '...';