6

如果我在 PHP 中有一个字符串在 PHP 中是令人讨厌的长字符串,我想缩短它,然后在它上面附加一些东西。

我想将它缩短为前 6 个单词或 42 个字符,无论哪个更短,然后在它被缩短时附加一个“...”。

唯一不会缩短并且没有添加“...”的情况是它最初少于 6 个单词或 42 个字符。

我怎样才能在 PHP 中做到这一点?

从逻辑上讲,我想我会用空格分割字符串,然后在数组中的空格之前添加每个东西,并且只从该数组中取出前 6 个元素并将它们写入一个新字符串。

这是我到目前为止的代码:

str_1 = 'The quick brown fox jumped over the lazy dog';
$words = explode(" ", $str_1);
$counter = 0;
str_2 = '';
foreach($words as $word){
    if($counter < 5){
        //append $words[counter] to str_2;
        counter++;
    }
    else{
        break;
    }
}

我不知道如何完成字符计数或比较或附加的其余部分。

有没有人有任何想法?

4

4 回答 4

10

我做的这个函数看起来很整洁:

function truncate($input, $maxWords, $maxChars)
{
    $words = preg_split('/\s+/', $input);
    $words = array_slice($words, 0, $maxWords);
    $words = array_reverse($words);

    $chars = 0;
    $truncated = array();

    while(count($words) > 0)
    {
        $fragment = trim(array_pop($words));
        $chars += strlen($fragment);

        if($chars > $maxChars) break;

        $truncated[] = $fragment;
    }

    $result = implode($truncated, ' ');

    if ($input == $result)
    {
        return $input;
    }
    else
    {
        return preg_replace('/[^\w]$/', '', $result) . '...';
    }
}

一些测试:

$str = 'The quick brown fox jumped over the lazy dog';

echo truncate($str, 5, 42); // The quick brown fox jumped...
echo truncate($str, 3, 42); // The quick brown...
echo truncate($str, 50, 30); // The quick brown fox jumped over the...
echo truncate($str, 50, 100); // The quick brown fox jumped over the lazy dog

它也不会将单词减半,因此如果一个单词将字符数推到提供的限制之上,它将被忽略。

于 2013-05-24T01:08:01.033 回答
3

计算单词(假设空格分隔单词):

$words = explode(' ', $string);
$wordCount = count($words );

计数字符

$length = strlen($string);

一起

if($wordCount > 5) {
    $words = array_slice($words, 0, 5);
    $string = implode(' ', $words);
    $length = strlen($string);
}
if($length > 42) {
    $string = substr($string , 0, 42);
}
于 2013-05-24T00:27:53.877 回答
2

这将为您提供前 6 个单词,或单词总长度小于 42 的前 n 个单词。

$words = explode(' ', $string);
$newstring = "";
$i=0;
while (strlen($newstring . $words[$i]) <= 42) && $i < 5) {
   $newstring .= $words[$i];
}
if (strlen($string) > strlen($newstring)) $newstring .= "..."; 
于 2013-05-24T00:44:12.573 回答
0
$string = "Your Text Here";
$string_length = 80; // give a random character value including whitespace.
if(strlen($string)>$string_length){
do{
    $new_string = substr($string,0,$string_length);
    $string_length++;
    }while(ctype_graph(substr($new_string,-1)));
  }
else {
   $new_string = $string;
}

echo $new_string;
于 2014-08-21T12:59:22.440 回答