javascript中的正则表达式与XML标记外部匹配

javascript中的正则表达式与XML标记外部匹配,javascript,regex,Javascript,Regex,我想在habbitant morbi triastbbitique中找到所有匹配的“a”,但标签中的“a”除外(见下文**之间的“a”) h*a*bbit*a*nt morbi tri*a*stbbitique. 如果我找到它们,我想替换它们,还想保存原始标记 此表达式不起作用: var variable = "a"; var reg = new RegExp("[^<]."+variable+".[^>]$",'gi'); var variable=“a”; var reg=ne

我想在
habbitant morbi triastbbitique
中找到所有匹配的“a”,但标签中的“a”除外(见下文**之间的“a”)

h*a*bbit*a*nt morbi tri*a*stbbitique.

如果我找到它们,我想替换它们,还想保存原始标记

此表达式不起作用:

var variable = "a";
var reg = new RegExp("[^<]."+variable+".[^>]$",'gi');
var variable=“a”;
var reg=new RegExp(“[^]$”,“gi”);
我推荐;这不是一个常规的语法,除了简单的情况,你会经历所有的痛苦

你的问题仍然有点不清楚,但让我试着重新措辞,看看我是否正确:

您想获取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)
//让浏览器为您解析它:
var container=document.createElement()
container.innerHTML='habbitant morbi triastbbitique'
var doc_text=$(容器).text()
//然后您可以正常地使用正则表达式:
文档文本匹配(/a/gi)
(更好的做法是使用,但目前还没有广泛的浏览器支持)


如果您在Node中,那么您需要寻找一些库来帮助您解析HTML节点(比如jsdom);然后只需显示下一个节点。

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

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

  • 一个简单的黑客前瞻,如:

      a(?![^<>]*>)
    
    替换为根据匹配的零件执行不同操作的函数。如果
    $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 + "*";
});
var str='habbiant 2>morbi。2a<3a三方体';
var re=/(]+)*>)|(a)/gi;
var res=str.replace(re,function(m,tag,a){
返回标签?标签:“*”+a+“*”;
});
结果:

<span class="a <lal> a" attr>h*a*bbit*a*nt 2 > morbi. 2*a* < 3*a*</span> tri*a*stbbitique
h*a*bbit*a*nt2>莫比。2*a*<3*a*tri*a*stbbitique
实例:

var str='habbiant 2>morbi。2a<3a三方体';
var re=/(]+)*>)|(a)/gi;
var res=str.replace(re,function(m,tag,a){
返回标签?标签:“*”+a+“*”;
});

控制台日志(res)我建议先获取文本内容,然后运行正则表达式。您可能需要检查问题的格式。我不太清楚您真正想要归档的内容。请澄清问题和语言。你所说的“匹配”到底是什么意思?所有匹配项都是
a
——在运行正则表达式之前,您知道这一点。你想替换吗?对不起,我的格式有问题。现在应该很清楚了。这实际上不是解析HTML。它是对HTML的标记化,正则表达式非常适合于此。如果HTML编写得很好,当然可以。但是如果
变量
包含
,并且您希望在文本节点中找到该变量的实例,该怎么办?在很多情况下,浏览器不会在未切换的控件字符处闪烁,而是将它们放置在文本节点中,而不是形成标记。
foo
。你不能认为有人对你很好,而且在任何情况下都有一个关于如何标记它的常规语法。@Never,请参阅我的更新答案,以获得一个处理
foo
和更糟问题的示例。如果你想看到一些更大的表达式,链接的内容可能会很有趣。;-)
<span class="a <lal> a" attr>h*a*bbit*a*nt 2 > morbi. 2*a* < 3*a*</span> tri*a*stbbitique