0

見逃したかもしれませんが、私がやろうとしていることを簡潔に達成する正規表現(または他の方法)を見つけていません。

HTML として表示されるカスタム HTML タグを含む長い文字列を生成しています。同じ長さのテキストを持ち、文字の配置を維持する必要がある 2 つの文字列を別々に生成していますが、それぞれに独自のマークアップがあります。例(ただし、はるかに長くなります):

xxxxx<mytag>nnnn</mytag>xxxx

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

アラインメントが維持されるように、それらを短い文字列 (たとえば 80 文字) に分割したいと考えています。明らかに、マークアップが異なるため、単純に文字数で分割することはできません。HTML タグも維持する必要があります。

最終的には、1 つの文字列が別の文字列の上に配置された状態で表示されます。私はこれを行う他の方法を受け入れていますが、ポインターイベントを維持する必要があります (カスタムタグは、マウスオーバーでツールチップを表示するスパンに解析されます)。この単一の HTML 要素を超えて機能が役立つため、文字列レベルでのソリューションが理想的です。私は AngularJS を使用しており、この関数はすべてのキーストロークを実行するため、あまり集中的ではありません。

どんな助けでも感謝します。ありがとう。

4

1 に答える 1

0

この場合、正規表現は役に立たないと思います。

ここでは、基本的な関数ウォークスルー メソッドを選択しました。これは非常にうまく機能します。

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>"]
于 2013-09-20T06:14:51.813 に答える