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
因此,除非返回到这一点,否则我们将继续编译缩写字符串-用空格将输入字符串拆分以创建单个单词,然后将每个单词空间对迭代地加回到一起,只要缩写字符串比指定的字符串短最大值。
![](https://i-blog.csdnimg.cn/blog_migrate/0f97e0bcd6d27a091d0ce36cd5badcea.png)
免费学习PHP!
全面介绍PHP和MySQL,从而实现服务器端编程的飞跃。
原价$ 11.95 您的完全免费
一旦完成了所需的编译,就可以中断迭代,然后在添加后缀并最终返回结果之前,从缩写字符串的末尾修剪剩余空间。 右修剪剩余空间,仅使用默认后缀将其添加回去,这似乎有点浪费,但是通过这样做,我们允许输入后缀完全没有空间。
结论
这样就可以了-一个简单但智能的字符串缩写功能,它还可以对输入进行预处理以删除多余的空格。 以我的经验,这两个需求经常同时出现,这就是为什么我开发了以这种方式工作的功能的原因。
翻译自: https://www.sitepoint.com/intelligent-string-abbreviation/
java 字符串数组简写