智能字符串缩写

对于小型函数系列的第七篇文章,我想向您展示一个名为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

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

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

结论

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

From: https://www.sitepoint.com/intelligent-string-abbreviation/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值