匹配正则表达式,如果不在特定HTML标记内

时间:2015-08-19 07:56:33

标签: javascript html regex

我想从HTML中获取不在特定HTML标记内的特殊格式化字符串({string})。

例如,我想匹配{test}而不是<var>{test}</var>

因此我使用以下正则表达式:(不包括使用?!

(?!<var>)\{\S+?\}(?!<\/var>)

所以这对于带空格的文本非常有效,但如果我有类似的东西(中间没有空格):

<var>{name}</var>{username} 

匹配两个{} - 字符串:{name}</var>{username}

我如何才能在这里匹配{username}

更新 如果我需要做这样的事情

<var.*?<\/var>|(\{\S+?\})

如何获取匹配的值,因为匹配的索引取决于位置。

示例:

匹配1:

"{username}<var>{name}</var>".match(/<var.*?<\/var>|(\{\S+?\})/g);
=> ["{username}", "<var>{name}</var>"]

比赛2:

"<var>{name}</var>{username}".match(/<var.*?<\/var>|(\{\S+?\})/g);
=> ["<var>{name}</var>", "{username}"]

当前解决方案:

angular.forEach(html.match(regex), function (match) {
  if(match.substring(0, 4) !== '<var') {
    newAdded = match;
  }
});

这真的是最好的&#39; JavaScript的解决方案?

1 个答案:

答案 0 :(得分:2)

以下是使用以下正则表达式实现此目的的方法:

/<var.*?<\/var>|(\{\S+?\})/g;

&#13;
&#13;
var s = '<var>{name}</var>{username}<var>{newname}</var>{another_username}';
var log = [];
var m;
var regex = /<var.*?<\/var>|(\{\S+?\})/g;
while ((m = regex.exec(s)) !== null) {
   if ( m[1] !== undefined) {
     log.push(m[1]);
   }
}
alert(log);
&#13;
&#13;
&#13;