【问题标题】:replace array of words替换单词数组
【发布时间】:2011-09-25 15:54:11
【问题描述】:
x.replace(/old/gi. 'new');
x.replace(/whatever/gi. 'whatevernew');
x.replace(/car/gi. 'boat');

有没有办法将它们组合在一个正则表达式语句和新旧单词数组中。也欢迎 PHP 解决方案。

【问题讨论】:

  • 我想你会好好利用这个LINK

标签: php javascript jquery regex replace


【解决方案1】:

你可以这样做:

var x = 'The old car is just whatever';
var arr = [{ old: /old/gi, new: 'new' },
           { old: /whatever/gi, new: 'whatevernew' },
           { old: /car/gi, new: 'boat' }];

for (var ii = 0; ii < arr.length; ii++) {
    x = x.replace(arr[ii].old, arr[ii].new);
}

【讨论】:

  • 实际上,您确实需要一个正则表达式来替换单词。此代码只会替换每个单词一次,并且区分大小写。你想要x.raplace(new RegExp(arr[ii].old, 'gi'), arr[ii].new)
【解决方案2】:

lbu 和 RobG 提出了一种使用回调的有趣方法。这是一个更通用的版本,其中您有一个函数,该函数仅将要替换的数据结构和要替换的数据结构作为参数。

function multiReplace(str, params) {
    var regStr = "";
    for (var i in params) {
        regStr += "(" + i + ")|";    // build regEx string
    }
    regStr = regStr.slice(0, -1);   // remove extra trailing |
    return(str.replace(new RegExp(regStr, "gi"), function(a) {
        return(params[a]);
    }));
}


var test = 'This old car is just whatever and really old';
var replaceParam = {"old": "new", "whatever": "something", "car": "boat"};

var result = multiReplace(test, replaceParam);
alert(result);

还有一个展示它的小提琴:http://jsfiddle.net/jfriend00/p8wKH/

【讨论】:

    【解决方案3】:

    试试这个:

    var regexes = { 'new': /old/gi, 'whatevernew': /whatever/gi, 'boat': /car/gi };
    
    $.each(regexes, function(newone, regex){
      x = x.replace(regex, newone);
    });
    

    或者这个:

    var regexes = { 'old':'new', 'whatever':'whatevernew', 'car':'boat'};
    
    $.each(regexes, function(oldone, newone){
      x = x.replace(new RegExp(oldone, 'gi'), newone);
    });

    【讨论】:

    • 这里的问题是顺序没有定义:whatevernew可能会在whatevernew之前被替换,所以你可能会在不同的迭代中得到不同的结果(或者至少不同的浏览器)
    • @Kobi 我认为它会按顺序处理。我找不到任何关于jQuery.each() 订单的资源。你有吗?
    • 这个,例如:stackoverflow.com/questions/242841#243778,或者这个:developer.mozilla.org/en/JavaScript/Reference/Statements/…。它不是特定于jQuery.each:对象属性之间没有顺序。不管jQuery.each如何实现,都不能依赖变量regexes的定义。不保证在内部保留您编写属性的顺序。
    【解决方案4】:

    这里还有一些:

    // Multi RegExp version
    var replaceSeveral = (function() {
      var data = {old:'new', whatever: 'whatevernew', car: 'boat'};
    
      return function(s) {
        var re;
        for (var p in data) {
          if (data.hasOwnProperty(p)) {
            re = new RegExp('(^|\\b)' + p + '(\\b|$)','ig');
            s = s.replace(re, '$1' + data[p] + '$2');
          }
        }
        return s;
      }
    }());
    
    // Replace function version
    var comparitor = (function() {
      var data = {old:'new', whatever: 'whatevernew', car: 'boat'};
      return function (word) {
        return data.hasOwnProperty(word.toLowerCase())? data[word] : word;
      }
    }());
    
    
    var s = 'old this old whatever is a car';
    alert(
      s 
      + '\n' + replaceSeveral(s)
      + '\n' + s.replace(/\w+/ig, comparitor)
    
    );
    

    【讨论】:

      【解决方案5】:

      Ibu 的回调解决方案相当简洁,但可以进一步简化:

      x = x.replace(/\b(?:old|whatever|car)\b/gi,
              function (m0) {
                  return {'old': 'new',
                          'car': 'boat',
                          'whatever': 'something'}[m0];
              });
      

      这种使用对象字面量的技术非常有效。我通过添加单词边界修改了正则表达式以仅匹配整个单词(以避免将 gold 更改为 gnew 等)。

      编辑:经过仔细检查,我发现 jfriend00 的解决方案使用了相同的技术(并且被概括为更有用)。

      【讨论】:

      • 查看提供的所有解决方案,我的原始代码似乎比此处提供的大多数答案更短、更高效。 +1 的努力
      【解决方案6】:

      replace 方法支持使用回调函数:

      var x = 'This old car is just whatever';
      var y = x.replace(/(old)|(whatever)|(car)/gi,function (a) {
          var str = "";
      
          switch(a){
            case "old":
               str = "new";
               break;
            case "whatever":
               str = "something";
               break;
            case "car":
               str = "boat";
               break;
            default: 
               str= "";
          }
          return str;
      });
      alert(y);
      
      // Y will print "This new car is just something"
      

      【讨论】:

      • 我觉得switch语句会更好。
      • 我最喜欢这个。 +1 但是回调函数可以简化为单个语句(请参阅我的解决方案)。
      猜你喜欢
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 2020-03-27
      • 2021-08-20
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多