-1

タグの「a」を除いて、の「a」のすべての一致を検索したい<span class="get">habbitant morbi</span> triastbbitique(以下の**の間の「a」を参照)。

<span class="get">h*a*bbit*a*nt morbi</span> tri*a*stbbitique.

見つけたら差し替えたいし、元のタグも残しておきたいです。

この式は機能しません:

var variable = "a";
var reg = new RegExp("[^<]."+variable+".[^>]$",'gi');
4

2 に答える 2

4

HTML の解析に正規表現を使用しないことをお勧めます。これは通常の文法ではなく、単純な場合を除いてすべての場合に苦労します。

あなたの質問はまだ少し不明確ですが、私が正しいかどうかを確認するために言い換えてみてください:

<tag>ボディ内の一致を除いて、HTML ドキュメント内の特定の文字列のすべての一致を取得したいですか?


jQuery などを使用していると仮定します。

// Let the browser parse it for you:
var container = document.createElement()
container.innerHTML = '<span class="get">habbitant morbi</span> triastbbitique'
var doc_text  = $(container).text()

// And then you can just regex away normally:
doc_text.match(/a/gi)

(さらに良いのはDOMParserを使用することですが、それはまだ幅広いブラウザをサポートしていません)

ノードを使用している場合は、HTML ノードの解析に役立つライブラリ (jsdom など) を探す必要があります。そして、次のすべてのノードを飛び散らせます。

于 2013-03-09T22:38:08.777 に答える
2

この質問は解析に関するものではないことに注意してください。これがレクシングです。正規表現が定期的かつ適切に使用されているもの。

正規表現を使用する場合は、いくつかの方法があります。

  • 次のような単純なハック先読み:

      a(?![^<>]*>)
    

    これは、タグ内/タグの外側でエスケープされていないものを適切に処理<および引用しないことに注意してください。>

  • 次の形式の本格的なトークナイザー:

      (expression for tag|comments|etc)|(stuff outside that that i'm interested in)
    

    どの部分が一致したかによって異なることをする関数に置き換えられました。$1一致した場合 はそれ$2自体に置き換えられ、一致した場合はそれを置き換えます*$2*

もちろん、完全なトークナイザーの方法は簡単な作業ではなく、仕様も小さくありません

ただし、基本的なタグのみに一致するように単純化し、CDATA、コメント、スクリプト/スタイル タグなどを無視する場合は、次を使用できます。

var str = '<span class="a <lal> a" attr>habbitant 2 > morbi. 2a < 3a</span> triastbbitique';

var re = /(<[a-z\/](?:"[^"]*"|'[^']*'|[^'">]+)*>)|(a)/gi;

var res = str.replace(re, function(m, tag, a){
    return tag ? tag : "*" + a + "*";
});

結果:

<span class="a <lal> a" attr>h*a*bbit*a*nt 2 > morbi. 2*a* < 3*a*</span> tri*a*stbbitique

実際の例:

var str = '<span class="a <lal> a" attr>habbitant 2 > morbi. 2a < 3a</span> triastbbitique';

var re = /(<[a-z\/](?:"[^"]*"|'[^']*'|[^'">]+)*>)|(a)/gi;

var res = str.replace(re, function(m, tag, a){
    return tag ? tag : "*" + a + "*";
});

console.log(res);

これは、HTML 内の乱雑なタグ、引用符、およびエスケープされていない</を処理します。>


正規表現を使用して HTML タグをトークン化するいくつかの例 (これは JS 正規表現にうまく変換されるはずです):

于 2013-03-09T22:54:56.410 に答える