查看字符串是否包含子字符串数组中的任何元素的最佳方法是什么?如果匹配则更换

时间:2015-11-19 18:01:20

标签: javascript jquery arrays string

好的,所以我需要解码许多网址(具体来说,我需要解码编码的特殊字符,例如" +"," |"等等。) / p>

我有一个我需要在URL字符串中搜索的编码字符列表。我可以采用字符串的最佳方法是什么,查找从该字符串中的子串数组中取出的任何子字符串,然后替换该子字符串。

示例:

假设这是我在主字符串中寻找的子串列表以及它们需要编码/解码的内容。

git

我把它作为我的字符串:

!   %21
"   %22
#   %23
$   %24
%   %25
&   %26
'   %27
(   %28
)   %29
*   %2A
+   %2B
,   %2C
-   %2D

如何将我的子字符串列表与此主字符串匹配,以便主字符串变为:

test.com/abc%2Bblahblah%28blahblah%22

3 个答案:

答案 0 :(得分:1)

使用

{{1}}

答案 1 :(得分:1)

其他人已经注意到()encodeURIComponent()可以用于示例中的特定字符编码方案。

为了后代能够满足不同要求的问题,如果你想要一个通用的字符串交换方案,这样的东西就可以了:

decodeURIComponent()

然后,您可以通过传入表示映射/图例的对象来创建编码器/解码器对象。

function encoderDecoder(legend) {
  this.encode = _encode;
  this.decode = _decode;
  function _encode(text) {
    for (var i = 0, len = legend.length; i < len; i++) {
      text = text.replace(new RegExp(legend[i].decoded, 'g'), legend[i].encoded);
    }
    return text;
  }
  function _decode(text) {
    var i = legend.length;
    while (i--) {
      text = text.replace(new RegExp(legend[i].encoded, 'g'), legend[i].decoded);
    }
    return text;
  }
}

此时,您可以调用对象的var mappings = [ {decoded: "e", encoded: "3"}, {decoded: "l", encoded: "1"}, {decoded: "o",encoded: "0"}, {decoded: "t",encoded: "7"}, {decoded: "a",encoded: "4"} ]; var decoder = new encoderDecoder(mappings); decoder.decode(str)方法,如下面的示例代码段所示。

&#13;
&#13;
decoder.encode(str)
&#13;
function encoderDecoder(legend) {
  this.encode = _encode;
  this.decode = _decode;

  function _encode(text) {
    for (var i = 0, len = legend.length; i < len; i++) {
      text = text.replace(new RegExp(legend[i].decoded, 'g'), legend[i].encoded);
    }
    return text;
  }

  function _decode(text) {
    var i = legend.length;
    while (i--) {
      text = text.replace(new RegExp(legend[i].encoded, 'g'), legend[i].decoded);
    }
    return text;
  }
}

var mappings = [{
  decoded: "e",
  encoded: "3"
}, {
  decoded: "l",
  encoded: "1"
}, {
  decoded: "o",
  encoded: "0"
}, {
  decoded: "t",
  encoded: "7"
}, {
  decoded: "a",
  encoded: "4"
}];

var decoder = new encoderDecoder(mappings);
updateOutput();

document.querySelector("input").addEventListener("keyup", updateOutput);

function updateOutput() {
  var value = document.querySelector("input").value;
  document.getElementById("encoded_output").innerHTML = decoder.encode(value);
  document.getElementById("decoded_output").innerHTML = decoder.decode(value);
}
&#13;
&#13;
&#13;

使用这种方法的一个警告是正则表达式是按顺序对整个字符串进行处理的,因此如果稍后出现的字符串交换规则之一与先前规则添加的字符串或子字符串匹配,那么它就是&#39; ll对它进行双重编码。相反,如果前面的规则以阻止规则被解除的方式修改了字符串,则某些规则可能永远不会找到匹配。

此问题仅适用于某些类型的编码/解码规则:允许重叠的规则。因此,例如,如果您想要添加&#34; cker&#34;的映射。到&#34; XXORZ&#34;在上面的示例代码中,您可以找到&#34; cker&#34;变为&#34; ck3r&#34;使用第一个映射(&#34; e&#34;到&#34; 3&#34;),因此新规则永远无法找到匹配。

答案 2 :(得分:0)

要直接替换示例中的字符串,请使用decodeURIComponent

decodeURIComponent('test.com/abc%2Bblahblah%28blahblah%22')
// => test.com/abc+blahblah(blahblah"