如何将字符串截断为PHP中的前20个单词?

时间:2009-06-08 14:45:17

标签: php string

如何在PHP中删除20个字后的字符串?

28 个答案:

答案 0 :(得分:123)

function limit_text($text, $limit) {
      if (str_word_count($text, 0) > $limit) {
          $words = str_word_count($text, 2);
          $pos = array_keys($words);
          $text = substr($text, 0, $pos[$limit]) . '...';
      }
      return $text;
    }

echo limit_text('Hello here is a long sentence blah blah blah blah blah hahahaha haha haaaaaa', 5);

输出:

Hello here is a long ...

答案 1 :(得分:26)

将数字3更改为下面的数字20以获取前20个字,或将其作为参数传递。以下演示了如何获取前3个字:(因此将3更改为20以更改默认值):

function first3words($s, $limit=3) {
    return preg_replace('/((\w+\W*){'.($limit-1).'}(\w+))(.*)/', '${1}', $s);   
}

var_dump(first3words("hello yes, world wah ha ha"));  # => "hello yes, world"
var_dump(first3words("hello yes,world wah ha ha"));   # => "hello yes,world"
var_dump(first3words("hello yes world wah ha ha"));   # => "hello yes world"
var_dump(first3words("hello yes world"));  # => "hello yes world"
var_dump(first3words("hello yes world.")); # => "hello yes world"
var_dump(first3words("hello yes"));  # => "hello yes"
var_dump(first3words("hello"));  # => "hello"
var_dump(first3words("a")); # => "a"
var_dump(first3words(""));  # => ""

答案 2 :(得分:11)

到最近的空间

截断到目标角色的最近前空格。 Demo

  • $str要截断的字符串
  • $chars要剥离的字符数量可以被$to_space
  • 覆盖
  • $to_space boolean是否要从$chars限制附近的空格中截断

<强> 功能

function truncateString($str, $chars, $to_space, $replacement="...") {
   if($chars > strlen($str)) return $str;

   $str = substr($str, 0, $chars);
   $space_pos = strrpos($str, " ");
   if($to_space && $space_pos >= 0) 
       $str = substr($str, 0, strrpos($str, " "));

   return($str . $replacement);
}

<强> 示例

<?php

$str = "this is a string that is just some text for you to test with";

print(truncateString($str, 20, false) . "\n");
print(truncateString($str, 22, false) . "\n");
print(truncateString($str, 24, true) . "\n");
print(truncateString($str, 26, true, " :)") . "\n");
print(truncateString($str, 28, true, "--") . "\n");

?>

输出

this is a string tha...
this is a string that ...
this is a string that...
this is a string that is :)
this is a string that is--

答案 3 :(得分:8)

使用explode()

来自文档的示例。

// Example 1
$pizza  = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2

请注意,explode具有限制功能。所以你可以做类似

的事情
$message = implode(" ", explode(" ", $long_message, 20));

答案 4 :(得分:7)

简单且完全配备的truncate()方法:

function truncate($string, $width, $etc = ' ..')
{
    $wrapped = explode('$trun$', wordwrap($string, $width, '$trun$', false), 2);
    return $wrapped[0] . (isset($wrapped[1]) ? $etc : '');
}

答案 5 :(得分:6)

尝试使用正则表达式。

你需要能够匹配20个单词(或20个单词边界)的东西。

所以(我的正则表达式非常糟糕,如果这不准确,请纠正我):

/(\w+\b){20}/

以下是some examples of regex in php

答案 6 :(得分:5)

它不是我自己的创作,它是以前帖子的修改。学分转到karim79。

function limit_text($text, $limit) {
    $strings = $text;
      if (strlen($text) > $limit) {
          $words = str_word_count($text, 2);
          $pos = array_keys($words);
          if(sizeof($pos) >$limit)
          {
            $text = substr($text, 0, $pos[$limit]) . '...';
          }
          return $text;
      }
      return $text;
    }

答案 7 :(得分:4)

This looks pretty good to me

  

创建动态时的常见问题   网页(内容来源)   来自数据库,内容管理   系统或外部源,如   RSS feed)是输入文本可以   太长并导致页面布局   '打破'。

     

一种解决方案是截断文本   这样它就适合页面。这个   听起来很简单,但往往是结果   由于言语和话语不符合预期   被切断的句子   不合适的分数。

答案 8 :(得分:4)

<空格>拆分字符串(放入数组),然后取出该数组的前20个元素。

答案 9 :(得分:3)

有三点:

function limitWords($text, $limit) {
    $word_arr = explode(" ", $text);

    if (count($word_arr) > $limit) {
        $words = implode(" ", array_slice($word_arr , 0, $limit) ) . ' ...';
        return $words;
    }

    return $text;
}

答案 10 :(得分:2)

尝试以下代码,

 $text  = implode(' ', array_slice(explode(' ', $text), 0, 32))
 echo $text;

答案 11 :(得分:2)

根据动静能量的回答:

function truncate_words($string,$words=20) {
 return preg_replace('/((\w+\W*){'.($words-1).'}(\w+))(.*)/', '${1}', $string);
}

function truncate_words_with_ellipsis($string,$words=20,$ellipsis=' ...') {
 $new = preg_replace('/((\w+\W*){'.($words-1).'}(\w+))(.*)/', '${1}', $string);
 if($new != $string){
  return $new.$ellipsis;
 }else{
  return $string;
 }

}

答案 12 :(得分:2)

在循环中使用PHP tokenizer函数strtok()

$token = strtok($string, " "); // we assume that words are separated by sapce or tab
$i = 0;
$first20Words = '';
while ($token !== false && $i < 20) {
    $first20Words .= $token;
    $token = strtok(" ");
    $i++;
}
echo $first20Words;

答案 13 :(得分:2)

这样的事情可能会成功:

<?php 
$words = implode(' ', array_slice(split($input, ' ', 21), 0, 20));

答案 14 :(得分:1)

要限制单词,请使用以下小代码:

    $string = "hello world ! I love chocolate.";
    $explode = array_slice(explode(' ', $string), 0, 4);
    $implode = implode(" ",$explode);   
    echo $implode;

$ implot会给:你好世界!我

答案 15 :(得分:1)

function getShortString($string,$wordCount,$etc = true) 
{
     $expString = explode(' ',$string);
     $wordsInString = count($expString);
     if($wordsInString >= $wordCount )
     {
         $shortText = '';
         for($i=0; $i < $wordCount-1; $i++)
         {
             $shortText .= $expString[$i].' ';
         }
         return  $etc ? $shortText.='...' : $shortText; 
     }
     else return $string;
} 

答案 16 :(得分:1)

如果您只在Laravel上进行编码,use Illuminate\Support\Str

这是示例

Str::words($category->publication->title, env('WORDS_COUNT_HOME'), '...')

希望这会有所帮助。

答案 17 :(得分:1)

另一种解决方案:)

$aContent = explode(' ', $cContent);
$cContent = '';
$nCount = count($aContent);
for($nI = 0; ($nI < 20 && $nI < $nCount); $nI++) {
   $cContent .= $aContent[$nI] . ' ';
}
trim($cContent, ' ');
echo '<p>' . $cContent . '</p>';

答案 18 :(得分:1)

这对我来说也是 UNICODE(UTF8)的句子:

function myUTF8truncate($string, $width){
    if (mb_str_word_count($string) > $width) {
        $string= preg_replace('/((\w+\W*|| [\p{L}]+\W*){'.($width-1).'}(\w+))(.*)/', '${1}', $string);
    }
    return $string;
}

答案 19 :(得分:1)

这是我使用的一个:

    $truncate = function( $str, $length ) {
        if( strlen( $str ) > $length && false !== strpos( $str, ' ' ) ) {
            $str = preg_split( '/ [^ ]*$/', substr( $str, 0, $length ));
            return htmlspecialchars($str[0]) . '&hellip;';
        } else {
            return htmlspecialchars($str);
        }
    };
    return $truncate( $myStr, 50 );

答案 20 :(得分:1)

这是我实施的内容。

function summaryMode($text, $limit, $link) {
    if (str_word_count($text, 0) > $limit) {
        $numwords = str_word_count($text, 2);
        $pos = array_keys($numwords);
        $text = substr($text, 0, $pos[$limit]).'... <a href="'.$link.'">Read More</a>';
    }
    return $text;
}

正如你所看到的,它基于karim79的答案,所有需要改变的是if语句还需要检查单词而不是字符。

为方便起见,我还添加了一个主要功能的链接。到目前为止,它完美无瑕地工作。感谢原始解决方案提供商。

答案 21 :(得分:0)

假设我们拥有字符串变量 $ string $ start $ limit ,我们可以从PHP借用3或4个函数来实现这一目标。他们是:

  • script_tags() PHP函数可删除不必要的HTML和PHP 标签(如果有)。如果没有HTML或PHP标记,则不需要这样做。
  • explode() $ string 拆分为一个数组
  • array_splice()以指定单词数及其起始位置 从。它将由分配给我们的 $ start $ limit 变量的值控制。
  • 最后是 implode(),将数组元素加入到您的截断中 字符串。

    Extension()

就这么简单。

我希望这会有所帮助。

答案 22 :(得分:0)

function limitText($string,$limit){
        if(strlen($string) > $limit){
                $string = substr($string, 0,$limit) . "...";
        }
        return $string;
}

这将返回20个字。希望对您有帮助

答案 23 :(得分:0)

我做了我的功能:

function summery($text, $limit) {
    $words=preg_split('/\s+/', $text);
     $count=count(preg_split('/\s+/', $text));
      if ($count > $limit) {
          $text=NULL;
          for($i=0;$i<$limit;$i++)
              $text.=$words[$i].' ';
          $text.='...';
      }
      return $text;
    }

答案 24 :(得分:0)

$text='some text';
$len=strlen($text);
    $limit=500;
// char
    if($len>$limit){
        $text=substr($text,0,$limit);
        $words=explode(" ", $text);
        $wcount=count($words);
        $ll=strlen($words[$wcount]);
        $text=substr($text,0,($limit-$ll+1)).'...';
    }

答案 25 :(得分:0)

function wordLimit($str, $limit) {
    $arr = explode(' ', $str);
    if(count($arr) <= $limit){
        return $str;   
    }
    $result = '';
    for($i = 0; $i < $limit; $i++){
        $result .= $arr[$i].' ';
    }
    return trim($result);
}
echo wordLimit('Hello Word', 1); // Hello
echo wordLimit('Hello Word', 2); // Hello Word
echo wordLimit('Hello Word', 3); // Hello Word
echo wordLimit('Hello Word', 0); // ''

答案 26 :(得分:-1)

怎么样

chunk_split($str,20);

PHP Manual

中的条目

答案 27 :(得分:-2)

    function limit_word($start,$limit,$text){
            $limit=$limit-1;
            $stripped_string =strip_tags($text);
            $string_array =explode(' ',$stripped_string);
            if(count($string_array)>$limit){
            $truncated_array = array_splice($string_array,$start,$limit);
            $text=implode(' ',$truncated_array).'...';
            return($text);
            }
            else{return($text);}
    }