この質問は解析に関するものではないことに注意してください。これがレクシングです。正規表現が定期的かつ適切に使用されているもの。
正規表現を使用する場合は、いくつかの方法があります。
次のような単純なハック先読み:
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 正規表現にうまく変換されるはずです):