4

我不知道如何在 Javascript 中进行全部替换。

我处于特殊情况,因为我有一张这样的替换地图

  :)   ->  <img src="smile.png" title=":) ">
  :(   ->  <img src="sad.png" title=":(">
  >:(  ->  <img src="angry.png" title=">:(">

我目前正在这张地图上循环,对于每个条目,我使用string.replace(from, to). 问题是我无法替换,例如,>:(因为:(已经被第二个条目替换了。如果我反转地图,那么:(intitle属性将被替换,导致真正的混乱。

希望你了解我的情况。我需要像str_replace带有数组参数的 PHP 之类的东西,它可以一键进行多次替换。

如果有帮助,我正在使用 Mootools。

4

2 回答 2

4

我会使用preg_replace_callback带有正则表达式转义的 php 的类似物。

var putSmiles = (function(){
  // init part
  var smilesMap = {
    ':)': "smile",
    ':(': "sad",
    '>:(': "angry"
  }
  if (!('escape' in RegExp)) {
    RegExp.escape = function(str) {
      return str.replace(/./g, function(m){
        // IE (at least 8) doesn't support .substr(-4), hence MOAR regexes!
        return "\\u" + ("0000" + m.charCodeAt(0).toString(16)).match(/.{4}$/)[0];
      });
    }
  }
  var a = [];
  for (var s in smilesMap) a.push(RegExp.escape(s));
  // sort in such way, if b is substring of a, b should follow a.
  a.sort(function(a,b){ return -a.indexOf(b) }); 
  var re = new RegExp(a.join('|'), 'g');
  // actual function 
  return (function(text) {
    return text.replace(re, function(m){
      return '<img src="' + smilesMap[ m ] + '.png" title="' + m + '">';
    });
  })
})();
于 2012-04-15T20:24:14.347 回答
1
var map = {
  ":)"  : '<img src="smile.png" title=":)">',
  ":("  : '<img src="sad.png" title=":(">',
  ">:(" : '<img src="angry.png" title=">:(">',
};
str.replace( />:\(|:\(|:\)/g, function(found){
  return map[found];
});

通过使用一次匹配所有三个的正则表达式,您可以保证不会误击替代方案;使用函数形式replace允许您动态确定替换字符串是什么。

编辑:动态转义要在正则表达式中使用的文字字符串中的任何“特殊”字符:

RegExp.escape = function(text) {
  return text.replace(/[.?*^$()|{}\-\[\]\\]/g, "\\$&");
}
于 2012-04-15T20:21:00.147 回答