java 字符串数组简写_智能字符串缩写

java 字符串数组简写

对于小型函数系列的第七篇文章,我想向您展示一个名为abbreviate()的函数-我相信您可以猜到它的主要目的! 它将字符串缩写为指定的最大长度,但是这样做很聪明-确保拆分不会出现在单词的中间,并对字符串进行预处理以删除多余的空格。

这是abbreviate函数的代码:

function abbreviate(str, max, suffix)
{
  if((str = str.replace(/^\s+|\s+$/g, '').replace(/[\r\n]*\s*[\r\n]+/g, ' ').replace(/[ \t]+/g, ' ')).length <= max)
  {
    return str;
  }
  
  var 
  abbr = '',
  str = str.split(' '),
  suffix = (typeof suffix !== 'undefined' ? suffix : ' ...'),
  max = (max - suffix.length);
  
  for(var len = str.length, i = 0; i < len; i ++)
  {
    if((abbr + str[i]).length < max)
    {
      abbr += str[i] + ' ';
    }
    else { break; }
  }

  return abbr.replace(/[ ]$/g, '') + suffix;
}

该函数接受三个参数 -原始输入字符串,最大输出长度和一个可选的后缀,以添加到缩写字符串的末尾。 如果未定义后缀,则默认为" ..." (后跟三个点的空格),这是表示缩写的常见且可识别的方式。

该功能的作用是什么

只要需要限制字符串的长度,就可以使用该函数,它是对简单substr表达式的更智能的替代。 有许多可能的应用程序-例如处理表单输入,创建自定义工具提示,在基于Web的电子邮件列表中显示消息主题,或预处理要通过Ajax发送的数据。

例如,要将字符串限制为100字符并添加默认后缀,我们可以这样称呼它:

str = abbreviate(str, 100);

从概念上讲,这等效于此substr表达式:

str = str.substr(0, 96) + " ..."

但这是一个非常钝的工具,因为它通常会导致输出字符串在单词中间被分割。 abbreviate函数是专门为不这样做而设计的,它将在最后一个单词之前而不是中间单词处拆分字符串。 因此,由abbreviate()生成的输出字符串通常会于指定的最大值-但永远不会更长

该函数还考虑了缩写后缀所需的空间,即,如果特定最大值(如果为100但后缀本身是4个字符,则我们最多只能使用主输入字符串的96个字符。

您可以通过传递空字符串来完全不指定后缀,或者如果您想缩写标记字符串,则可以将其定义为HTML关闭标记。 例如,以下输入:

abbreviate("<p>One two three four five</p>", 15, "</p>");

将产生以下输出:

<p>One two</p>

功能如何运作

abbreviate功能的关键是能够将输入字符串分割成单个单词,然后重新编译尽可能多的单词以适合最大长度。

为了使此效果有效,我们需要确保单词之间的拆分是可预测的,而最简单的方法是通过最小化内部空格 -将换行符和制表转换为空格,然后减少连续的空格,以便内部空格变为单个空格。 当然,还有其他处理方式-例如,我们可以为split定义更灵活的正则表达式,以解决我们可能在单词之间找到的所有不同种类的字符。 正则表达式( "b" )甚至有一个单词边界字符,因此我们可以使用它。

但是我发现,空格预处理本身就很有用,特别是在涉及用户输入时。 而且按单词边界分割不会产生预期的结果,因为破折号,点,逗号和大多数特殊字符实际上都算作单词边界。 但是我认为用标点符号来分隔单词是不合适的,除非该字符后面带有空格,以使诸如连字符和代码片段之类的内容不会在中间分隔。

因此,该函数的第一项工作是进行空白预处理,然后如果结果已经小于指定的最大值,我们可以立即将其返回:

if((str = str.replace(/^\s+|\s+$/g, '').replace(/[\r\n]*\s*[\r\n]+/g, ' ').replace(/[ \t]+/g, ' ')).length <= max)
{
  return str;
}

如果我们不这样做,那么我们可能会遇到这种情况,即在不必一定要使用字符串的情况下将其缩写,例如:

abbreviate("Already long enough", 20)

没有第一个条件,我们将获得缩写输出,因为指定的最大值必须考虑后缀的长度:

Already long ...

而添加第一个条件会产生未修改的输出:

Already long enough

因此,除非返回到这一点,否则我们将继续编译缩写字符串-用空格将输入字符串拆分以创建单个单词,然后将每个单词空间对迭代地加回到一起,只要缩写字符串比指定的字符串短最大值。

免费学习PHP!

全面介绍PHP和MySQL,从而实现服务器端编程的飞跃。

原价$ 11.95 您的完全免费

一旦完成了所需的编译,就可以中断迭代,然后在添加后缀并最终返回结果之前,从缩写字符串的末尾修剪剩余空间。 右修剪剩余空间,仅使用默认后缀将其添加回去,这似乎有点浪费,但是通过这样做,我们允许输入后缀完全没有空间。

结论

这样就可以了-一个简单但智能的字符串缩写功能,它还可以对输入进行预处理以删除多余的空格。 以我的经验,这两个需求经常同时出现,这就是为什么我开发了以这种方式工作的功能的原因。

翻译自: https://www.sitepoint.com/intelligent-string-abbreviation/

java 字符串数组简写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值