-1

我想在标签中找到“a”的所有匹配项<span class="get">habbitant morbi</span> triastbbitique,但标签中的“a”除外(参见下面的“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;这不是常规语法,除了简单的情况外,您都会遇到痛苦。

您的问题仍然有点不清楚,但让我尝试改写一下,看看我是否正确:

您想获取 HTML 文档中给定字符串的所有匹配项,但<tag>正文中的匹配项除外?


假设您使用的是 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,但这还没有广泛的浏览器支持)

如果你在 Node 中,那么你想寻找一些帮助你解析 HTML 节点的库(比如 jsdom);然后只是吐出所有下一个节点。

于 2013-03-09T22:38:08.777 回答
2

请注意,这个问题与解析无关。这是词法。正则表达式经常和正确使用的东西。

如果你想使用正则表达式,有几种方法可以做到这一点。

  • 一个简单的 hack 前瞻,如:

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

    请注意,这不会在标签中正确处理<>引用/在标签之外未转义。

  • 一个完整的分词器:

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

    替换为根据匹配的部分执行不同操作的函数。如果 $1匹配,它将被它自己替换,如果$2matchehd 将其替换为*$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 回答