首页 >web前端 >js教程 >智能弦缩写

智能弦缩写

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌原创
2025-02-24 08:48:14867浏览

Intelligent String Abbreviation

核心要点

  • JavaScript中的abbreviate()函数能够智能地将字符串缩短到指定的最大长度,确保不会在单词中间断开,并去除多余的空格。
  • 该函数接受三个参数:原始输入字符串、最大输出长度和一个可选的后缀,添加到缩写字符串的末尾。如果未定义后缀,则默认为“…”,表示缩写。
  • 此函数可用于需要限制字符串长度的任何场景,例如处理表单输入、创建自定义工具提示、在基于 Web 的电子邮件列表中显示邮件主题或预处理要通过 Ajax 发送的数据。
  • 该函数的有效性在于它能够将输入字符串拆分为单个单词,然后重新组合尽可能多的单词以适应最大长度。它还会预处理输入以去除多余的空格。

本文将介绍一个名为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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn