基于文本长度的换行符,保留自定义HTML标记

时间:2013-09-20 00:03:35

标签: javascript html regex

也许错过了,但还没有找到一个正则表达式(或其他方式)来完成我想要简洁地做的事情。

我正在生成包含自定义HTML标记的长字符串,这些标记将显示为HTML。我分别生成两个字符串,它们具有相同长度的文本,需要保持字符对齐,但每个字符串都有自己唯一的标记。例如。 (虽然会更长):

xxxxx<mytag>nnnn</mytag>xxxx

<mytag2>xxxxx</mytag2>nnnn<mytag3>xxxx</mytag3>

我想将它们分成较短的字符串(例如80个字符),以便保持对齐。显然,由于标记不同,我不能简单地按字符数分割。 我还需要维护HTML标记。

最终,它们将显示为对齐方式,其中一个字符串位于另一个字符串之上。我对其他方法持开放态度,但需要维护指针事件(自定义标记将解析为在鼠标悬停时显示工具提示的跨度)。字符串级别的解决方案将是理想的,因为该功能将超出此单个HTML元素。我正在使用AngularJS,该函数运行每次击键,因此不能太强烈。

任何帮助表示赞赏。感谢。

1 个答案:

答案 0 :(得分:0)

在这种情况下,我认为正则表达式不会有用。

我选择了基本的函数 - walkthrough方法,它在这里工作得很好:

function splitByLength(str, length) {
    var lines = [];
    var isInTag = false;
    var start = 0;
    var count = 0;
    var tagLength = 0;

    for (i = 0; i < str.length; i++) {
        if (str[i] == "<") {
            isInTag = true;
        }

        if (!isInTag) {
            count++;
        } else {
            tagLength++;
        }

        if (count >= length) {
            lines.push(str.substr(start, count+tagLength));
            start = count+tagLength;
            count = 0;
            tagLength = 0;
        }

        if (str[i] == ">") {
            isInTag = false;
        }
    }

    lines.push(str.substr(start));

    return lines;
}

示例:

splitByLength("xxxxx<mytag>nnnn</mytag>xxxx", 10)
>>> ["xxxxx<mytag>nnnn</mytag>x", "xxx"]

splitByLength("<mytag2>xxxxx</mytag2>nnnn<mytag3>xxxx</mytag3>", 10)
>>> ["<mytag2>xxxxx</mytag2>nnnn<mytag3>x", "xxx</mytag3>"]