PHP字符串/文字处理问题

时间:2009-08-26 01:28:22

标签: php string

假设我有以下句子:

A quick brown fox jumped over a lazy dog.

但是我有一个限制,那句话只允许25个字符。这可能会让我有类似的事情:

A quick brown fox jum

然而,这句话没有任何语法意义,所以我宁愿找到我们可以允许的最后一个词,同时保持25个字符限制。这将给我们类似的东西:

A quick brown fox

这将低于25个字符限制,但它具有更多的语法意义。即 单词没有被分解,我们在保持极限的同时拥有最多的可理解单词。

如何编写一个带字符串的函数和一个char限制(如25),如果字符串超出限制,则返回可能包含最大字数的字符串?

3 个答案:

答案 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);

此实现的一些额外功能:

  • 也可以在换行符和标签处拆分字词。
  • 保存一个以字符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;

}