Javascript 仅当匹配模式为';它不在包含正则表达式的内容中的特定位置

Javascript 仅当匹配模式为';它不在包含正则表达式的内容中的特定位置,javascript,html,angularjs,regex,Javascript,Html,Angularjs,Regex,我们正在构建的部分工具在很大程度上依赖于正则表达式。 其中之一就是使用标准javascript的“RegExp”动态地用实际值替换占位符 我们所有的占位符都是这样的: {{key}} 在大多数情况下,更换是直接和简单的,我们构建了匹配模式,如下所示: var pattern = new RegExp('{{key}}', 'g'); 然而,至少有一种情况下,这种方法不起作用。假设我们有一个a标记,其href中有一个占位符: <a href="http://google.com?q={{

我们正在构建的部分工具在很大程度上依赖于正则表达式。 其中之一就是使用标准javascript的“RegExp”动态地用实际值替换占位符

我们所有的占位符都是这样的:

{{key}}
在大多数情况下,更换是直接和简单的,我们构建了匹配模式,如下所示:

var pattern = new RegExp('{{key}}', 'g');
然而,至少有一种情况下,这种方法不起作用。假设我们有一个
a
标记,其href中有一个占位符:

<a href="http://google.com?q={{key}}">http://google.com?q={{key}}</a>

我们需要用html代码替换占位符(在某些情况下),但正如您所想象的,它会破坏标记

注意:它可能是任何链接或链接内的任何内容


如何仅替换不在
href
中的占位符?甚至有可能吗?

根据您想对
href
中的
{{key}}
执行什么操作,您可以退出大括号,或者添加对过滤器的支持

转义:

var values = {"key": "stackoverflow"};
var html = template.replace(/\\([{}\\])|{{(\w+)}}/g, function (match, esc, name) {
    // Remove backslashes from an escaped characters, or replace placeholders
    // by their values.
    return esc ? esc : values[name];
});
例如:

<a href="http://google.com?q=\{{key}}">http://google.com?q={{key}}</a>
<a href="http://google.com?q={{key|quote}}">http://google.com?q={{key}}</a>

过滤器:

var values = {"key": "stackoverflow"};
var filters = {
    "quote": function (value) {
        return quote.replace(/"/g, "&quot;");
    }
};
var html = template.replace(/{{(\w+(?:\s*\|\s*\w+)*)}}/g, function (match, expr) {
    var names = expr.split(/\s*\|\s*/g);
    var value = values[expr[0]];
    for (var i = 1; i < names.length; i++) {
        value = filters[name[i]](value);
    }
});
var值={“key”:“stackoverflow”};
变量过滤器={
“报价”:函数(值){
返回报价。替换(/“/g,”);
}
};
var html=template.replace(/{(\w+(?:\s*\\124;\ s*\w+)}}/g,函数(匹配,表达式){
变量名称=表达式拆分(/\s*\\124;\ s*/g);
var值=值[expr[0]];
对于(变量i=1;i
例如:

<a href="http://google.com?q=\{{key}}">http://google.com?q={{key}}</a>
<a href="http://google.com?q={{key|quote}}">http://google.com?q={{key}}</a>


您还可以使用AngularJS的内置模板

var templateElm = angular.element("<div>").html(template);

var innerScope = $scope.$new(true);

// Shallow copy values into the scope
angular.extend(innerScope, values);

var elem = $compile(templateElm)(innerScope);

// Wait for automatic $digest to complete
$timeout(function () {
    var html = elem.html();

    innerScope.$destroy();

    // Do something with 'html'
});
var templatelm=angular.element(“”.html(模板);
var innerScope=$scope.$new(true);
//将值浅拷贝到范围中
角度扩展(内部范围,值);
var elem=$compile(templatelm)(内部范围);
//等待自动$digest完成
$timeout(函数(){
var html=elem.html();
内窥镜。$destroy();
//用“html”做些什么
});

匹配并捕获要保留的文本,只需匹配需要替换的文本即可。请看,使用JS代码进一步操作组内容。好的,这一个对于这个特定的情况非常具体。占位符可能位于内容中的任何位置,而不仅仅是链接。我想知道,是否有办法找到href属性之外的所有内容。同样的方法,根据您的需要进行调整:。与任何用于HTML操作的正则表达式方法一样,这并不能保证在100%的情况下都能很好地工作。所以,如果不是正则表达式,您会有什么建议?