最多显示这么多字符的字符串而不拆分单词

Posted

技术标签:

【中文标题】最多显示这么多字符的字符串而不拆分单词【英文标题】:Display string to a maximum of so many characters without splitting word 【发布时间】:2012-02-23 20:57:10 【问题描述】:

我目前正在开发一个 php 项目,我需要在其中显示最多 100 个字符的字符串,但不拆分单词。

例如,如果我有字符串

敏捷的棕狐跳过懒狗的背

假设第 100 个字符在“跳跃”的中间。 目前我正在使用substr($mystring, 0, 100)

这将打印出来

快速的棕色狐狸跳

在这种情况下,我想打印

快速的棕色狐狸

这个可以解决吗

【问题讨论】:

【参考方案1】:
$string = 'The quick brown fox jumped over the lazy dogs back';
$maxLength = 20;

if (strlen($string) > $maxLength) 
    $stringCut = substr($string, 0, $maxLength);
    $string = substr($stringCut, 0, strrpos($stringCut, ' ')); 


echo $string;

// output: The quick brown fox

关键是用strrpos在空格处而不是单词中间截断。

注意:如果这些字符串的源使用多字节字符集,例如 UTF-8,您将需要使用 multibyte 等效函数。

【讨论】:

旧线程,但这总是会切断最后一个单词,不管它超过了可能不是人们想要的最大长度。【参考方案2】:

PHP 的 wordwrap() 函数可以提供帮助。 http://php.net/manual/en/function.wordwrap.php

由于分隔符字符串,这有点hacky,但简洁:

$str2 = wordwrap($str,20,'@@@@@');
$str_final = substr($str2,0,strpos($str2,'@@@@@'));

请注意,如果您的原始字符串包含“@@@@@”,这将中断,我将其用作唯一分隔符,我认为大多数英文字符串中不会出现该分隔符。随意将“@@@@@”更改为更古怪/独特的东西。

【讨论】:

【参考方案3】:
//Set up -  we need 100 characters
$s="The quick brown fox jumped over the lazy dogs back";
$s="$s. $s. s.";

//Cut
$t=substr($s,0,100);

//Trim
$u=preg_replace('/^(.*).\s\w*$/','$1',$t);

//Output
echo $u;

【讨论】:

以上是关于最多显示这么多字符的字符串而不拆分单词的主要内容,如果未能解决你的问题,请参考以下文章

hibernate查询不搜索超过2个字符的某些字符串,而不是在多字搜索上工作

如何在不破坏单词的情况下将字符串拆分为行?

将字符串 c++ 截断为长度而不剪切单词

拆分中间带有回车符的字符串(JAVA)[重复]

关于自然语言处理系列-分词

将输入框条目的字符串拆分为单词的子字符串