我正在尝试将一大块文本剪切到大约 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.
答案 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 . '...';