【问题标题】:limit string to first 5 words or first 42 characters in PHP在 PHP 中将字符串限制为前 5 个单词或前 42 个字符
【发布时间】:2013-05-24 00:20:16
【问题描述】:

如果我在 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;
    }
}

我不知道如何处理字符计数或比较或追加的其余部分。

有人有什么想法吗?

【问题讨论】:

  • 您似乎知道如何进行,到目前为止您有什么代码?什么特定的部分阻碍了你?
  • @Lepidosteus 附加和字符数阻止了我。我用代码更新了问题。
  • 为什么不只获取前六个单词并使用 css 作为 ...?
  • @Jack 因为并非所有浏览器都支持 :after。
  • 不是所有的都指的是古董浏览器吗? :)

标签: php string


【解决方案1】:

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

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

它也不会把单词减半,所以如果一个单词超过了提供的限制,它将被忽略。

【讨论】:

    【解决方案2】:

    计算字数(假设空格分隔字数):

    $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);
    }
    

    【讨论】:

    • 我会保留原来的字符串,所以我可以说if ($string !== $original) $string .= '...';
    【解决方案3】:

    这将为您提供前 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 .= "..."; 
    

    【讨论】:

      【解决方案4】:
      $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;
      

      【讨论】:

      • 欢迎来到 Stack Overflow。您应该解释它的作用以及它如何解决问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多