Php 将文本修剪为340个字符

Php 将文本修剪为340个字符,php,ellipsis,Php,Ellipsis,我正在从数据库中提取博客帖子。我想将文本的最大长度修剪为340个字符 如果这篇博文超过340个字符,我想把文字删减到最后一个完整的单词,并在末尾加上“…” E.g. NOT: In the begin.... BUT: In the ... 尝试: 似乎您希望首先将文本精确地缩减到340个字符,然后找到字符串中最后一个“”的位置并缩减到该数量。像这样: $string = substr($string, 0, 340); $string = substr($string, 0, strrp

我正在从数据库中提取博客帖子。我想将文本的最大长度修剪为340个字符

如果这篇博文超过340个字符,我想把文字删减到最后一个完整的单词,并在末尾加上“…”

E.g.

NOT: In the begin....

BUT: In the ...
尝试:


似乎您希望首先将文本精确地缩减到340个字符,然后找到字符串中最后一个“”的位置并缩减到该数量。像这样:

$string = substr($string, 0, 340);
$string = substr($string, 0, strrpos($string, ' ')) . " ...";

其他答案向您展示了如何使文本大约包含340个字符。如果这对你合适,那么使用其他答案之一

但是如果你想要一个340个字符的非常严格的最大值,那么其他答案将不起作用。您需要记住,添加
“…”
会增加字符串的长度,您需要考虑到这一点

$max_length = 340;

if (strlen($s) > $max_length)
{
    $offset = ($max_length - 3) - strlen($s);
    $s = substr($s, 0, strrpos($s, ' ', $offset)) . '...';
}
还请注意,这里我使用的是重载
strrpos
,它使用偏移量直接从字符串中的正确位置开始搜索,而不是首先缩短字符串


在线查看:您可以尝试使用PHP附带的函数,如wordwrap

print wordwrap($text,340) . "...";
函数修剪字符($text,$length=340){

}

使用此函数trim_characters()将字符串修剪为指定的字符数,并在空白处优雅地停止。
我认为这对你很有帮助。

我用一种方法给出了约翰·康德的答案:

function softTrim($text, $count, $wrapText='...'){

    if(strlen($text)>$count){
        preg_match('/^.{0,' . $count . '}(?:.*?)\b/siu', $text, $matches);
        $text = $matches[0];
    }else{
        $wrapText = '';
    }
    return $text . $wrapText;
}
示例:

echo softTrim("Lorem Ipsum is simply dummy text", 10);
/* Output: Lorem Ipsum... */

echo softTrim("Lorem Ipsum is simply dummy text", 33);
/* Output: Lorem Ipsum is simply dummy text */

echo softTrim("LoremIpsumissimplydummytext", 10);
/* Output: LoremIpsumissimplydummytext... */

如果启用了mbstring扩展名(现在大多数服务器上都启用了该扩展名),则可以使用mb_strimwidth函数

echo mb_strimwidth($string, 0, 340, '...');

为什么这样?

  • 我喜欢子字符串上的正则表达式解决方案,以捕获除空格分词以外的任何其他内容(函数间等)
  • John Condoe的解决方案并不完全正确,因为它将文本修剪为340个字符,然后完成最后一个单词(因此通常会比预期的长)
实际的正则表达式解决方案非常简单:

/^(.{0,339}\w\b)/su
PHP中的完整方法可能如下所示:

function trim_length($text, $maxLength, $trimIndicator = '...')
{
        if(strlen($text) > $maxLength) {

            $shownLength = $maxLength - strlen($trimIndicator);

            if ($shownLength < 1) {

                throw new \InvalidArgumentException('Second argument for ' . __METHOD__ . '() is too small.');
            }

            preg_match('/^(.{0,' . ($shownLength - 1) . '}\w\b)/su', $text, $matches);                               

            return (isset($matches[1]) ? $matches[1] : substr($text, 0, $shownLength)) . $trimIndicator ;
        }

        return $text;
}
function trim_length($text,$maxLength,$trimdindicator='…)
{
if(strlen($text)>maxLength){
$shownLength=$maxLength-strlen($trimlindicator);
如果($shownLength<1){
抛出new\InvalidArgumentException(“.\uu方法\uuuu..”()的第二个参数太小。”);
}
preg_match('/^(.{0',.($shownLength-1)。'}\w\b)/su',$text,$matches);
return(isset($matches[1])?$matches[1]:substr($text,0,$shownLength))。$trimnindicator;
}
返回$text;
}
更多说明:

  • $shownLength
    是为了保持非常严格的限制(如Mark Byers所述)
  • 如果给定的长度太小,将引发异常
  • \w\b
    部分是为了避免结尾出现空白或函数间冲突(见下文1)
  • 若第一个单词的长度超过所需的最大长度,那个么该单词将被无情地剪切

  • 尽管…中有问题的结果
    被描述为所需,但我觉得…
    中的
    更平滑(也不喜欢…
    中的
  • 最简解

    $text_to_be_trim= "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry standard.";
    if(strlen($text_to_be_trim) > 20)   
        $text_to_be_trim= substr($text_to_be_trim,0,20).'....';
    
    用于多字节文本

    $stringText= "UTIL CONTROL DISTRIBUCION AMARRE CIGÜEÑAL";
    $string_encoding = 'utf8';
    $s_trunc =  mb_substr($stringText, 0, 37, $string_encoding);
    echo $s_trunc;
    

    默认情况下,
    与换行符不匹配。因此,当第340个字符前面有换行符时,它将不起作用。最后添加一个
    s
    修饰符就可以了。需要一些修饰(检查字符串是否需要缩短,等等),但要短而甜。做
    $。='''.''.'
    不是比最后一步更容易吗?@silkAdmin:谢谢你的评论。我对我的答案做了一些改进。很酷,很老的帖子,但我相信它对很多人仍然有用!应该注意的是,如果文本中没有空格,这只会产生“…”结果!这帮了大忙。。谢谢,如果用户输入一个长度为341个字符的单词(帖子中没有空格),你会怎么做?所有人都欢迎一行!非常好的捕获:)当你遇到一个特殊字符时,这个可能会失败。我刚和你在一起。如果你就在那里砍,它就失败了。如果你再往前走一个字符,它就行了。所以,马克·拜尔斯的答案是我的首选。很好用。你能分享一下要修剪的文字吗?这样我就可以检查我的解决方案了当然。试试这个,然后插入“UTIL CONTROL DISTRIBUCION AMARRE CIGÜEñAL”。字母40给我。谢谢你的字符串&如果你想修剪多字节文本,请使用,我也在更新我的特殊字符的答案
    $text_to_be_trim= "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry standard.";
    if(strlen($text_to_be_trim) > 20)   
        $text_to_be_trim= substr($text_to_be_trim,0,20).'....';
    
    $stringText= "UTIL CONTROL DISTRIBUCION AMARRE CIGÜEÑAL";
    $string_encoding = 'utf8';
    $s_trunc =  mb_substr($stringText, 0, 37, $string_encoding);
    echo $s_trunc;