当前位置: 首页 > 面试题库 >

如何截断PHP中最接近一定数量字符的字符串?

庞书
2023-03-14
问题内容

我有一个用PHP编写的代码片段,可从数据库中提取文本块并将其发送到网页上的小部件。原始文本块可以是冗长的文章或简短的句子或两个;但是对于此小部件,我最多只能显示200个字符。我可以使用substr()以200个字符的形式截断文本,但是结果是在
单词 中间截断-我真正想要的是在200个字符之前的最后一个 的末尾截断文本。


问题答案:

通过使用自动换行功能。它将文本分成多行,以使最大宽度为您指定的宽度,并在单词边界处断开。拆分后,您只需走第一行:

substr($string, 0, strpos(wordwrap($string, $your_desired_width), "\n"));

文本本身短于所需宽度时,oneliner无法处理的一件事。要处理这种情况,应该执行以下操作:

if (strlen($string) > $your_desired_width) 
{
    $string = wordwrap($string, $your_desired_width);
    $string = substr($string, 0, strpos($string, "\n"));
}

如果文本在实际剪切点之前包含换行符,则上述解决方案存在过早剪切文本的问题。这里是解决此问题的版本:

function tokenTruncate($string, $your_desired_width) {
  $parts = preg_split('/([\s\n\r]+)/', $string, null, PREG_SPLIT_DELIM_CAPTURE);
  $parts_count = count($parts);

  $length = 0;
  $last_part = 0;
  for (; $last_part < $parts_count; ++$last_part) {
    $length += strlen($parts[$last_part]);
    if ($length > $your_desired_width) { break; }
  }

  return implode(array_slice($parts, 0, $last_part));
}

另外,这是用于测试实现的PHPUnit测试类:

class TokenTruncateTest extends PHPUnit_Framework_TestCase {
  public function testBasic() {
    $this->assertEquals("1 3 5 7 9 ",
      tokenTruncate("1 3 5 7 9 11 14", 10));
  }

  public function testEmptyString() {
    $this->assertEquals("",
      tokenTruncate("", 10));
  }

  public function testShortString() {
    $this->assertEquals("1 3",
      tokenTruncate("1 3", 10));
  }

  public function testStringTooLong() {
    $this->assertEquals("",
      tokenTruncate("toooooooooooolooooong", 10));
  }

  public function testContainingNewline() {
    $this->assertEquals("1 3\n5 7 9 ",
      tokenTruncate("1 3\n5 7 9 11 14", 10));
  }
}

不处理特殊的UTF8字符,例如“à”。在REGEX的末尾添加’u’来处理它:

$parts = preg_split('/([\s\n\r]+)/u', $string, null, PREG_SPLIT_DELIM_CAPTURE);



 类似资料:
  • 问题内容: 我有一列字符串,每个字符串中都有一个城市,州和数字。 不仅限于此,但我想知道如何截断此列中的数字并仅显示城市和州,或者甚至更好地截断这些数字,然后将城市和州作为一个单独的列。 对于所有不同的记录,该列始终采用相同的格式。 谢谢! 问题答案: 没有为您做所有的工作… City:列的子字符串,从位置0到第一次出现逗号-1. State:列的子字符串,从第一次出现逗号后的2个位置到下一个空格

  • 根据指定的长度截断字符串。 确定字符串的 length 是否大于 num。 返回截断所需长度的字符串,用 '...' 附加到结尾或原始字符串。 const truncateString = (str, num) => str.length > num ? str.slice(0, num > 3 ? num - 3 : num) + '...' : str; truncateString('

  • 问题内容: 如何在PHP中20个单词后截断字符串? 问题答案: 输出:

  • 本文向大家介绍PHP指定截取字符串中的中英文或数字字符的实例分享,包括了PHP指定截取字符串中的中英文或数字字符的实例分享的使用技巧和注意事项,需要的朋友参考一下 我们在开发过程中,经常会碰到截取中文英文数字等的问题,大家知道中文所占的字符和英文数字是不同的;然后我们就会在项目的common里写一些日常的函数包含时间计算转换和中英文字符截取的函数;比如截取中英文的函数没个几行代码恐怕拿不下来的吧,

  • 问题内容: 如何在Python中将字符串截断为75个字符? 这是用JavaScript完成的方式: 问题答案:

  • 问题内容: 我要做的是从字符串中删除所有重音符号和变音符号,将“lärm”变成“ larm”,或者将“andré”变成“ andre”。我试图做的是先对字符串进行utf8_decode,然后在其上使用strtr,但是由于我的源文件另存为UTF-8文件,因此我无法输入所有变音符号的ISO-8859-15字符- 编辑器将插入UTF-8字符。 显然,解决方案是拥有一个包含ISO-8859-15文件的包含