【问题标题】:javascript replace globally with arrayjavascript用数组全局替换
【发布时间】:2011-01-05 01:30:48
【问题描述】:

您可以使用数组进行替换:

var array = {"from1":"to1", "from2":"to2"}

for (var val in array)
    text = text.replace(array, array[val]);

但是如果你需要全局替换,即 text = text.replace(/from/g, "to");

数组很大,所以如果我为每个变量写“text = text.replace(...)”,脚本会占用很多空间。

在这种情况下如何使用数组? "/from1/g":"to1" 不起作用。

【问题讨论】:

  • 你的数组实际上是一个Object对象,而不是Array对象,即使它可以被认为是一个关联数组:)
  • 这能回答你的问题吗? Replace multiple strings at once

标签: javascript replace


【解决方案1】:

这是我的解决方案,假设 array 中的字符串键不需要转义。

当对象array很大时特别有效:

var re = new RegExp(Object.keys(array).join("|"), "g");
var replacer = function (val) { return array[val]; };
text = text.replace(re, replacer);

请注意,这需要Object.keys 方法可用,但如果不可用,您可以轻松地对其进行填充。

【讨论】:

    【解决方案2】:

    这是 JS 中简单的、非基于 RegExp 的字符串替换的习语,因此您无需担心 regex 特殊字符:

    for (var val in array)
        text= text.split(val).join(array[val]);
    

    请注意,将对象用作通用查找存在一些问题。如果有人对 Object 原型感到困惑(这是个坏主意,但有些库会这样做),您可以获得比您想要的更多的 val​s;您可以使用hasOwnProperty 测试来避免这种情况。另外,在 IE 中,如果你的字符串碰巧与 Object 的方法(例如 toString)发生冲突,IE 会神秘地隐藏它。

    对于您的示例,您可以,但作为字符串可以是任何东西的一般情况,您需要通过处理键字符串以避免冲突,或使用不同的数据结构来解决它比如[find, replace]数组的数组。

    【讨论】:

      【解决方案3】:
      var array = {"from1":"to1", "from2":"to2"}
      
      for (var val in array)
          text = text.replace(new RegExp(val, "g"), array[val]);
      

      编辑:正如 Andy 所说,您可能必须使用像 this one 这样的脚本来转义特殊字符。

      【讨论】:

      • 如果字符串可能包含正则表达式特殊字符,不要忘记正确转义它们。
      • 此页面上的此解决方案和其他两个解决方案适用于某些情况,但存在各种问题,包括累积替换(允许替换替换字符串)和带有特殊字符的输入的损坏。 Here is a more robust solution.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      相关资源
      最近更新 更多