3
4

3 に答える 3

3

nodejs または最近の JavaScript エンジン (「マップ」と「分割」の実装用) を使用していると思われるので、次のようにします。

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" />')

=>

"hey <img src="smile.gif" /> <code>:)</code>"
于 2014-01-27T03:57:53.990 に答える
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(結果);

于 2014-01-27T04:09:45.807 に答える