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