Php 替换单词数组

Php 替换单词数组,php,javascript,jquery,regex,replace,Php,Javascript,Jquery,Regex,Replace,是否有一种方法可以将它们组合到一个regexp语句和一个新旧单词数组中。也欢迎使用PHP解决方案。您可以这样做: x.replace(/old/gi. 'new'); x.replace(/whatever/gi. 'whatevernew'); x.replace(/car/gi. 'boat'); var x='这辆旧车什么都不是'; var arr=[{old:/old/gi,new:'new'}, {old:/whatever/gi,new:'whatevernew'}, {old:/

是否有一种方法可以将它们组合到一个regexp语句和一个新旧单词数组中。也欢迎使用PHP解决方案。

您可以这样做:

x.replace(/old/gi. 'new');
x.replace(/whatever/gi. 'whatevernew');
x.replace(/car/gi. 'boat');
var x='这辆旧车什么都不是';
var arr=[{old:/old/gi,new:'new'},
{old:/whatever/gi,new:'whatevernew'},
{old:/car/gi,new:'boat'}];
对于(变量ii=0;ii
试试这个:

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);
}
或者这个:

var regexes = { 'new': /old/gi, 'whatevernew': /whatever/gi, 'boat': /car/gi };

$.each(regexes, function(newone, regex){
  x = x.replace(regex, newone);
});

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

var regexes = { 'old':'new', 'whatever':'whatevernew', 'car':'boat'};

$.each(regexes, function(oldone, newone){
  x = x.replace(new RegExp(oldone, 'gi'), newone);
});
这里还有几个:

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"

lbu和RobG使用回调提供了一种有趣的方法。这里有一个更通用的版本,其中有一个函数,它只接受一个数据结构,其中包含要替换的内容和要替换的内容作为参数

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

);

一把小提琴显示了它的作用:

Ibu的回调解决方案非常干净,但可以进一步简化:

x=x.replace(/\b(?:old | whatever | car)\b/gi,
功能(m0){
返回{'old':'new',
‘车’:‘船’,
‘whatever’:‘something’}[m0];
});
这种使用对象文字的技术非常有效。我修改了正则表达式,通过添加单词边界(避免将
gold
更改为
gnew
等)只匹配整个单词


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

我认为您会很好地使用它,实际上,您确实需要一个正则表达式来替换word。此代码将只替换每个单词一次,并且区分大小写。你想要
x.raplace(new RegExp(arr[ii].old,'gi'),arr[ii].new)
。这里的问题是没有定义顺序:任何
都有可能在
whatevernew
之前替换
new
,因此你可能在不同的迭代中得到不同的结果(或者至少不同的浏览器)@科比,我想它会按顺序处理的。我找不到任何关于
jQuery.each()
顺序的资源。你有吗?这个,例如:,或者这个:。它不是特定于
jQuery的。每个
:对象属性之间没有顺序。无论如何
jQuery。每个
都是实现的,您不能依赖变量
regex
的定义。您编写属性的顺序不能保证在内部保留。我认为switch语句会更好。我最喜欢这个+1然而,回调函数可以简化为一条语句(参见我的解决方案)。从提供的所有解决方案来看,我的原始代码似乎比这里提供的大多数答案更短、更有效+1.感谢您的努力
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);