javascript - 如何在保留 HTML 的同时 chop 元素的文本内容?

标签 javascript regex

我意识到这里有几个类似的问题,但没有一个答案能解决我的问题。

我需要能够接受 innerHTML元素并将其 chop 为给定的字符长度,同时考虑任何内部 HTML 元素的文本内容并保留所有 HTML 标记。

我找到了几个很好地涵盖了这部分问题的答案,以及几个插件都可以做到这一点。

但是,在所有情况下,解决方案都会直接在任何内部元素的中间 chop ,然后关闭标签。

在我的例子中,我需要所有内部标签的内容保持完整,基本上允许任何“将被” chop 的内部标签超过给定的字符限制。

如有任何帮助,我们将不胜感激。

编辑:

例如:

This is an example <a href="link">of a link</a> inside another element

以上是 51 个字符长,包括空格。如果我想将其 chop 为 23 个字符,我们将不得不缩短 </a> 中的文本标签。这正是大多数解决方案所做的。

这会给我以下内容:

This is an example <a href="link">of a</a>

但是,对于我的用例,我需要保持所有剩余的可见标签完整无缺,并且不以任何方式被 chop 。

鉴于上面的示例,当尝试 chop 为 23 个字符时,我想要的最终输出如下:

This is an example <a href="link">of a link</a>

所以基本上我们是在检查 chop 发生的地方。如果它在元素之外,我们可以将 HTML 字符串拆分为恰好该长度。另一方面,如果它在 inside 元素中,我们将移动到该元素的结束标记,对所有父元素重复,直到我们返回到根字符串并将其拆分在那里。

最佳答案

听起来您希望能够将 HTML 字符串的长度 chop 为文本字符串,例如考虑以下 HTML:

'<b>foo</b> bar'

在这种情况下,HTML 的长度为 14 个字符,文本长度为 7。您希望能够将其 chop 为 X 个文本字符(例如 2),以便新的 HTML 是现在:

'<b>fo</b>'

披露:我的答案使用了我开发的库。

您可以使用 HTMLString 库 - Docs : GitHub .

库使这项任务变得非常简单。要使用 HTMLString chop 我们上面概述的 HTML(例如, chop 2 个文本字符),您需要使用以下代码:

var myString = new HTMLString.String('<b>foo</b> bar');
var truncatedString = myString.slice(0, 2);
console.log(truncatedString.html());

编辑:从 OP 获取更多信息后。

以下 chop 函数 chop 到最后一个完整标记并满足嵌套标记的需要。

function truncate(str, len) {
    // Convert the string to a HTMLString
    var htmlStr = new HTMLString.String(str);

    // Check the string needs truncating
    if (htmlStr.length() <= len) {
        return str;
    }

    // Find the closing tag for the character we are truncating to
    var tags = htmlStr.characters[len - 1].tags();
    var closingTag = tags[tags.length - 1];

    // Find the last character to contain this tag
    for (var index = len; index < htmlStr.length(); index++) {
        if (!htmlStr.characters[index].hasTags(closingTag)) {
            break;
        }
    }

    return htmlStr.slice(0, index);
}

var myString = 'This is an <b>example ' +
    '<a href="link">of a link</a> ' +
    'inside</b> another element';

console.log(truncate(myString, 23).html());
console.log(truncate(myString, 18).html());

这将输出:

This is an <b>example <a href="link">of a link</a></b>
This is an <b>example <a href="link">of a link</a> inside</b>

关于javascript - 如何在保留 HTML 的同时 chop 元素的文本内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32381804/

相关文章:

javascript - 存储在变量中的关联数组中的访问 key

javascript - 无法分配给函数“class Template7”的只读属性 'prototype'

javascript - VueRouter 不滚动到 anchor 标签

java - 使用java正则表达式提取html链接

regex - 如何使用正则表达式提取具有特定单位的值并求和

MySQL-基于多列输出 "other"列

javascript - Ext.getElementById 不适用于 Ext.Controller init 或 onLaunch 事件

javascript - 在 char '-' 或 '/' 匹配后替换

javascript - 多个 IP 的正则表达式,以逗号分隔,带或不带子网

javascript - 使用 jQuery、Javascript 或 PHP 从备用选择中选择 <select> <option>