Php 将文本修剪为340个字符
我正在从数据库中提取博客帖子。我想将文本的最大长度修剪为340个字符 如果这篇博文超过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
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;
}
更多说明:
是为了保持非常严格的限制(如Mark Byers所述)$shownLength
- 如果给定的长度太小,将引发异常
部分是为了避免结尾出现空白或函数间冲突(见下文1)\w\b
- 若第一个单词的长度超过所需的最大长度,那个么该单词将被无情地剪切
被描述为所需,但我觉得…
中的更平滑(也不喜欢…
中的)
$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;