假设我有以下句子:
A quick brown fox jumped over a lazy dog.
但是我有一个限制,那句话只允许25个字符。这可能会让我有类似的事情:
A quick brown fox jum
然而,这句话没有任何语法意义,所以我宁愿找到我们可以允许的最后一个词,同时保持25个字符限制。这将给我们类似的东西:
A quick brown fox
这将低于25个字符限制,但它具有更多的语法意义。即 单词没有被分解,我们在保持极限的同时拥有最多的可理解单词。
如何编写一个带字符串的函数和一个char限制(如25),如果字符串超出限制,则返回可能包含最大字数的字符串?
答案 0 :(得分:12)
使用正则表达式很容易:
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);
此实现的一些额外功能:
编辑更改了正则表达式,以便只将字母,数字,“_”和“ - ”视为单词字符。
答案 1 :(得分:2)
<?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
答案 2 :(得分:0)
您无法尝试调整此功能。我从php网站上获取了这个想法,并根据我的需要进行了调整。 它接受一个字符串的“head”和“tail”,并将字符串(考虑单词)减少到给定的长度。 根据您的需要,您可以正确地删除该功能的所有“尾部”部分。
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;
}