请注意,这个问题与解析无关。这是词法。正则表达式经常和正确使用的东西。
如果你想使用正则表达式,有几种方法可以做到这一点。
一个简单的 hack 前瞻,如:
a(?![^<>]*>)
请注意,这不会在标签中正确处理<
和>
引用/在标签之外未转义。
一个完整的分词器:
(expression for tag|comments|etc)|(stuff outside that that i'm interested in)
替换为根据匹配的部分执行不同操作的函数。如果 $1
匹配,它将被它自己替换,如果$2
matchehd 将其替换为*$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 正则表达式):