核心要点
abbreviate()
函数能够智能地将字符串缩短到指定的最大长度,确保不会在单词中间断开,并去除多余的空格。本文将介绍一个名为abbreviate()
的简洁高效的JavaScript函数,其主要功能正如其名:智能地缩短字符串到指定的长度。它确保不会在单词中间截断,并预处理字符串以去除多余的空格。以下是abbreviate
函数的代码:
<code class="language-javascript">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; }</code>
该函数接受三个参数:原始输入字符串、最大输出长度和一个可选的后缀,添加到缩写字符串的末尾。如果未定义后缀,则默认为“…”(一个空格后跟三个点),这是一种常见且易于识别的缩写指示方式。
函数用途
此函数可用于需要限制字符串长度的任何场景,作为简单substr
表达式的更智能的替代方案。可能的应用有很多,例如处理表单输入、创建自定义工具提示、在基于 Web 的电子邮件列表中显示邮件主题或预处理要通过 Ajax 发送的数据。例如,要将字符串限制为 100 个字符并添加默认后缀,我们可以这样调用它:
<code class="language-javascript">str = abbreviate(str, 100);</code>
这在概念上等同于此substr
表达式:
<code class="language-javascript">str = str.substr(0, 96) + " ...";</code>
但这是一种非常粗略的方法,因为它常常会导致输出字符串在单词中间断开。abbreviate
函数专门设计为不会这样做,它会在最后一个单词之前拆分字符串,而不是在单词中间拆分。因此,abbreviate()
生成的输出字符串通常会短于指定的最大长度,但绝不会长于它。该函数还考虑了缩写后缀所需的空格,即如果指定的最大长度为 100,但后缀本身为 4 个字符,那么我们最多只能使用 96 个主输入字符串的字符。您可以通过传递空字符串来指定根本没有后缀,或者如果您想缩写标记字符串,则可以将其定义为 HTML 关闭标签。例如,以下输入:
<code class="language-javascript">abbreviate("<p>One two three four five</p>", 15, "");</code>
将产生此输出:
<code class="language-javascript">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; }</code>
函数工作原理
abbreviate
函数的关键在于能够将输入字符串拆分为单个单词,然后重新组合尽可能多的单词以适应最大长度。为了提高效率,我们需要确保单词之间的分隔符是可预测的,最简单的方法是最小化内部空格——将换行符和制表符转换为空格,然后减少连续空格,以便每个内部空格块都变成一个空格。当然,还有其他方法可以处理这个问题——例如,我们可以为分割定义更灵活的正则表达式,该表达式考虑了我们可能在单词之间找到的所有不同类型的字符。甚至还有一个用于正则表达式的单词边界字符(“b”),所以我们也可以使用它。但我发现空格预处理本身很有用,尤其是在处理用户输入时。而按单词边界分割不会产生预期的结果,因为破折号、点、逗号和大多数特殊字符实际上都被视为单词边界。但我认为除非字符后跟空格,否则按标点符号分割单词是不合适的,这样连字符单词和代码片段就不会在中间分割。因此,该函数的第一项工作是进行空格预处理,然后如果结果已经短于指定的最大值,我们可以直接返回它:
<code class="language-javascript">str = abbreviate(str, 100);</code>
如果我们不这样做,那么我们可能会遇到字符串在不必缩写时被缩写的情况,例如:
<code class="language-javascript">str = str.substr(0, 96) + " ...";</code>
如果没有第一个条件,我们将得到缩写的输出,因为指定的最大值必须考虑后缀的长度:
<code class="language-javascript">abbreviate("<p>One two three four five</p>", 15, "");</code>
而添加第一个条件则会产生未修改的输出:
<code class="language-html"><p>One two></code>
因此,除非我们在此时返回,否则我们将继续编译缩写字符串——按空格分割输入字符串以创建单个单词,然后迭代地将每个单词-空格对重新组合在一起,只要缩写字符串短于指定的最大长度。一旦我们编译了所需的内容,我们就可以中断迭代,然后从缩写字符串的末尾修剪残留的空格,然后再添加后缀,最后返回结果。从右端修剪残留的空格然后再用默认后缀添加它看起来有点浪费,但这允许输入后缀根本没有空格。
结论
这就是一个简单但智能的字符串缩写函数,它还会预处理输入以去除多余的空格。根据我的经验,这两个要求通常会同时出现,这就是我开发此函数以这种方式工作的原因。
(由于篇幅限制,此处省略了FAQ部分。 如果需要,可以单独提供FAQ部分的伪原创版本。)
以上是智能弦缩写的详细内容。更多信息请关注PHP中文网其他相关文章!