JS中replace替換全部的正確應用


一般使用

var str = "test-test-test";
str = "test-test-test".replace("test", "ok");
console.log(str);

使用正則:

var str = "test-test-test";
str = "test-test-test".replace(/test/g, "ok");
console.log(str);

循環替換

如下這種情況,表情標簽的替換,我們需要正常的字符串替換,例如結合 while + indexOf 實現。

var faces = {
  "/::)": "weixiao",
  "/::~": "pizui",
  "/::B": "se",
  "/::|": "fadai",
  "/:8-)": "deyi",
  "/::<":"liulei",
  "/::$": "haixiu",
  "/::'(": "daku",
  "/::-|": "gangga"
};

var str = "/::)-/::B-/::)-/:8-)-/:8-)";

for (var k in faces) {
  while(str.indexOf(k) > -1) {
    str = str.replace(k, faces[k]);
  }
}

console.log(str);

這樣,基本功能實現,不過這是有問題的,如果有一個鍵值相同的,就會死循環例如:

var faces = {
  "/::)": "weixiao",
  "/:hehe": "/:hehe"
};

var str = "/::)-/::B-/:hehe-/:8-)-/:8-)";

for (var k in faces) {
  while(str.indexOf(k) > -1) {
    str = str.replace(k, faces[k]);
  }
}

console.log(str);

修改為如下代碼解決死循環問題:

var faces = {
  "/::)": "weixiao",
  "/:hehe": "/:hehe"
};

var str = "/::)-/::B-/:hehe-/:8-)-/:8-)";

for (var k in faces) {
  var p = -1; // 字符出現位置
  var s = 0; // 下一次起始位置
  while((p = str.indexOf(k, s)) > -1) {
    s = p + faces[k].length; // 位置 + 值的長度
    str = str.replace(k, faces[k]);
  }
}

console.log(str);

再進行簡單封裝一下:

/**
 * 字符串替換
 * @param  {string} str    要被替換的字符串
 * @param  {string} substr 要替換的字符串
 * @param  {string} newstr 用於替換的字符串
 * @return {string}        替換后的新字符串
 */
function replace(str, substr, newstr) {
  var p = -1; // 字符出現位置
  var s = 0; // 下一次起始位置

  while((p = str.indexOf(substr, s)) > -1) {
    s = p + newstr.length; // 位置 + 值的長度
    str = str.replace(substr, newstr);
  }

  return str;
}

console.log( replace("ssssss", "ss", "s") ); // sss

使用RegExp封裝

/**
 * 字符串替換
 * @param  {string} str    要被替換的字符串
 * @param  {string} substr 要替換的字符串
 * @param  {string} newstr 用於替換的字符串
 * @return {string}        替換后的新字符串
 */
function replace(str, substr, newstr) {
  substr = substr.replace(/[.\\[\]{}()|^$?*+]/g, "\\$&"); // 轉義字符串中的元字符
  var re = new RegExp(substr, "g"); // 生成正則
  return str.replace(re, newstr);
}

console.log( replace("ssssss", "ss", "s") ); // sss

 參考地址:http://www.52cik.com/2015/11/06/replace-all.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM