RegEx忽略<code> and <pre> tags</pre></code>之间的所有内容

时间:2014-01-27 02:58:04

标签: javascript regex nodebb

尝试解析一些内容(没有DOM可用 - 或DOM解析器,例如jQuery,Cheerio)用图像替换一些单词/符号(基本上是情感),但是想忽略<code></code>之间的所有内容和<pre></pre>这个例子非常适合取代所有的情感,但不会忽略代码和预标签 http://jsbin.com/odARehI/5/edit?js,console

如果您运行脚本,您将在代码标记之前看到第一个打印输出,第二个打印出来。

会欣赏另一组关于该模式的眼睛。感谢

// see link for a list of the emotions to parse
var pattern = /&gt;:\)|\([\w~]+\)|\\[:]?[od]\/|[:;\|bBiIxX8\(\)\]][=\-"^:]?[)>$&|\w\(\)*@#?]?[)>$&|\w\(\)*@#?]/g;

我尝试了一些在没有弄乱原始比赛的情况下无效的事情。

对于不用解析-html-with-regex-police-department :这是运行服务器端的,目前我没有奢侈的DOM解析器。

谢谢。

更新:对于忽略<code>代码的RegExp解决方案,请参阅此github/frissdiegurke

中的commit来看这个简洁的解决方案
/(^|<\/code>)([^<]*|<(?!code>))*(<code>|$)/g

3 个答案:

答案 0 :(得分:3)

如果没有DOM解析,您将遇到失败的边缘情况。但是,这应该适合你。

鉴于此HTML:

Hello :) <pre>Wassup :)</pre> Maybe :) <code>:) Foo</code> :) Bar

使用此代码:

var blocks = [];
html = html.replace(/(?:<pre>.*?<\/pre>|<code>.*?<\/code>)/g, function (match) {
    blocks.push( match );
    return '__BLOCK__';
});

html = html.replace(/:\)/g, 'SMILE');

html = html.replace(/__BLOCK__/g, function () {
    return blocks.shift();
});

产生:

Hello SMILE <pre>Wassup :)</pre> Maybe SMILE <code>:) Foo</code> SMILE Bar

只需根据您的需要调整/:\)/g替换即可。

答案 1 :(得分:3)

猜猜你正在使用nodejs或最近的javascript引擎(用于“map”和“split”实现),所以你可以这样做:

function replaceSpecial(str, pattern, replacement) {
  var REG = /(<code>.*?<\/code>)|(<pre>.*?<\/pre>)/i;
  return str.split(REG).map(function(s) {
    if ('' + s !== s)
      return '';
    if (s.match(REG))
      return s;
    return s.replace(pattern, replacement);
  }).join('');
}

示例:

replaceSpecial("hey :) <code>:)</code> :'( <pre> :'( :)</pre>", /(:\))|(:'\()/, function(s) {
  switch(s) {
    case ":)":
      return '<img src="smile.gif" />';
    case ":'(":
      return '<img src="cry.gif" />';
  }
})

将返回:

"hey <img src="smile.gif" /> <code>:)</code> <img src="cry.gif" /> <pre> :'( :)</pre>"

如果您只想替换表情符号,则更容易:

replaceSpecial("hey :) <code>:)</code>", ":)", '<img src="smile.gif" />')

=&GT;

"hey <img src="smile.gif" /> <code>:)</code>"

答案 2 :(得分:2)

var co = -1, ce = 0, start=0, result; 
while ( ce != -1 ) {
   co = testString.indexOf('<code', ce);
   if (co > -1) {
     result += parse(testString.substring(start,co), pattern1); 
     start = co+1;
     ce = testString.indexOf('</code>', co + 5);
     if (ce >-1 ){
        start = ce + 7;
        ce = start;
        result += testString.substring(co,ce);
     }
  }
}
result += parse(testString.substring(start), pattern1);

的console.log(结果);