4

Javascript ですべて置換する方法がわかりません。

次のような置換マップがあるため、特定の状況に陥っています。

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

現在、このマップをループしており、エントリごとにstring.replace(from, to). 問題は、たとえば、が既に 2 番目のエントリに置き換えられている>:(ため、置き換えることができないことです。:(そして、マップを逆にする:(と、title属性が置き換えられて、本当に混乱します。

私の状況を理解していただければ幸いです。str_replace1 回のヒットで複数の置換を行う、配列引数を持つ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];
});

3つすべてに一度に一致する正規表現を使用することにより、代替案を誤ってヒットしないことが保証されます。の関数形式をreplace使用すると、置換文字列が動的に何であるかを判別できます。

編集:正規表現で使用されるリテラル文字列内の「特殊」文字を動的にエスケープするには:

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