0
var target   = $(".target-text"),
    relation = ['spun gold', 'gold', 'apple'],
    len      = relation;

for (var i=0; i<len; i++) {

    var e = relation[i],
        re = new RegExp(e,"ig");

    if (e.length > 0) {
        target.html( target.html().replace(re, "<span class='hit'>$&</span>") );
    }

};

検索された文字はタグで囲まれています。

現時点では問題があります。
問題は、検索の順番が変わることです。

aのように['spun gold', 'gold', 'apple']大丈夫です
が、aのように['gold', 'spun gold', 'apple']ngです。

gold => <span class='hit'>gold</span>最初に実行すると、
spun gold => <span class='hit'>spun gold</span>うまくいきません。
(初めてgoldに変更さ<span class='hit'>gold</span>れたので。)

より良い方法はありますか?


編集:

条件として、検索は英語だけではありません。

4

1 に答える 1

3

問題があると思います。共通の部分文字列を共有しているため、1つの置換が前の置換を台無しにしています。

relation正規表現の1つの大きな「または」に用語を組み合わせて、単一の置換を実行します。

var target   = $('.target-text'),
    relation = ['spun gold', 'gold', 'apple'],
    re = new RegExp(relation.join('|'), 'ig');

target.html(function (_, oldHtml) {
    return oldHtml.replace(re, "<span class='hit'>$&</span>");
});

注意.join('|'):特殊文字が正規表現を壊さないように、配列要素を引用する前に引用符で囲む必要がある場合があります。(例:) relation = ['foo', 'bar?']。方法は次のとおりです。Javascript正規表現で使用するためのエスケープ文字列

于 2012-12-02T06:45:17.013 に答える