ฉันจะดำเนินการ str_replace ใน JavaScript โดยแทนที่ข้อความใน JavaScript ได้อย่างไร


137

ฉันต้องการที่จะใช้str_replaceหรือทางเลือกที่คล้ายกันเพื่อแทนที่ข้อความใน JavaScript

var text = "this is some sample text that i want to replace";
var new_text = replace_in_javascript("want", "dont want", text);
document.write("new_text");

ควรให้

this is some sample text that i dont want to replace

หากคุณกำลังจะ regex สิ่งที่เป็นผลการปฏิบัติงานเมื่อเทียบกับวิธีการเปลี่ยนในตัว


3
แปลกไม่มีใครสังเกตเห็นว่า PHP str_replaceยังยอมรับสองอาร์เรย์ที่มีความยาวเท่ากันโดยที่แต่ละสตริงในอาร์เรย์แรกจะถูกแทนที่ด้วยสตริงในอาร์เรย์ที่สองที่ดัชนีเดียวกัน โปรดดูstackoverflow.com/a/5069776/296430สำหรับฟังก์ชั่นที่ถูกต้องเท่านั้นที่ฉันได้พบจนถึงตอนนี้ที่เลียนแบบพฤติกรรมที่แน่นอนในจาวาสคริปต์
Jules Colle

2
@JulesColle คำตอบนั้นล้มเหลวบ่อยครั้ง - ดูว่าทำไม / เมื่อล้มเหลวและเป็นทางออกที่ดีกว่าที่นี่: stackoverflow.com/a/37949642/445295
Stephen M. Harris

1
หากคุณต้องการความเข้ากันได้สูง - รวมถึงนิสัยใจคอ - กับรุ่น php ... ลองดูที่github.com/kvz/locutus/blob/master/src/php/strings/ …
Doug Coburn

คำตอบ:


12

การใช้ regex สำหรับการแทนที่สตริงนั้นช้ากว่าการใช้การแทนที่สตริงอย่างมาก
ดังที่แสดงบน JSPerfคุณสามารถมีระดับประสิทธิภาพที่แตกต่างกันสำหรับการสร้าง regex แต่ทั้งหมดนั้นช้ากว่าการแทนที่สตริงอย่างมีนัยสำคัญ regex ช้าลงเพราะ :

การจับคู่สตริงคงที่ไม่มีการย้อนรอยขั้นตอนการคอมไพล์ช่วงคลาสอักขระหรือโฮสต์ของคุณสมบัติอื่น ๆ ที่ทำให้เอ็นจินการแสดงออกปกติทำงานช้าลง มีวิธีการเพิ่มประสิทธิภาพการแข่งขัน regex แต่ฉันคิดว่ามันไม่น่าจะชนะการจัดทำดัชนีเป็นสตริงในกรณีทั่วไป

สำหรับการทดสอบอย่างง่าย ๆ ในหน้าเพอร์เฟ็กต์ JS ฉันได้ทำเอกสารผลลัพธ์บางอย่างแล้ว:

<script>
// Setup
  var startString = "xxxxxxxxxabcxxxxxxabcxx";
  var endStringRegEx = undefined;
  var endStringString = undefined;
  var endStringRegExNewStr = undefined;
  var endStringRegExNew = undefined;
  var endStringStoredRegEx = undefined;      
  var re = new RegExp("abc", "g");
</script>

<script>
// Tests
  endStringRegEx = startString.replace(/abc/g, "def") // Regex
  endStringString = startString.replace("abc", "def", "g") // String
  endStringRegExNewStr = startString.replace(new RegExp("abc", "g"), "def"); // New Regex String
  endStringRegExNew = startString.replace(new RegExp(/abc/g), "def"); // New Regexp
  endStringStoredRegEx = startString.replace(re, "def") // saved regex
</script>

ผลลัพธ์สำหรับ Chrome 68 มีดังนี้:

String replace:    9,936,093 operations/sec
Saved regex:       5,725,506 operations/sec
Regex:             5,529,504 operations/sec
New Regex String:  3,571,180 operations/sec
New Regex:         3,224,919 operations/sec

จากความสมบูรณ์ของคำตอบนี้ (ยืมมาจากความคิดเห็น) มันคุ้มค่าที่จะกล่าวถึงว่า.replaceจะแทนที่เพียงตัวอย่างแรกของตัวละครที่ตรงกัน //gเท่านั้นที่เป็นไปได้ที่จะเปลี่ยนทุกกรณีด้วย การแลกเปลี่ยนประสิทธิภาพและความสง่างามของรหัสอาจเป็นเรื่องที่แย่กว่าเดิมหากแทนที่หลาย ๆ กรณีname.replace(' ', '_').replace(' ', '_').replace(' ', '_');หรือแย่กว่านั้นwhile (name.includes(' ')) { name = name.replace(' ', '_') }


น่าสนใจและเหมาะสมแล้วที่การแทนที่สตริงบริสุทธิ์นั้นเร็วกว่า regex มันอาจจะคุ้มค่าที่จะกล่าวถึง (เช่นในบางคำตอบ) ที่.replaceจะแทนที่อินสแตนซ์แรกของอักขระที่ตรงกันเท่านั้น //gเท่านั้นที่เป็นไปได้ที่จะเปลี่ยนทุกกรณีด้วย การแลกเปลี่ยนผลการดำเนินงานอาจเป็นที่ถกเถียงกันว่าจะแย่ลงหากเปลี่ยนหลายกรณีname.replace(' ', '_').replace(' ', '_').replace(' ', '_');หรือแย่กว่านั้นwhile (name.includes(' ')) { name = name.replace(' ', '_') }
Lex

201

คุณจะใช้replaceวิธีการ:

text = text.replace('old', 'new');

อาร์กิวเมนต์แรกคือสิ่งที่คุณมองหาอย่างชัดเจน นอกจากนี้ยังสามารถยอมรับการแสดงออกปกติ

เพียงจำไว้ว่ามันจะไม่เปลี่ยนสตริงเดิม มันจะส่งกลับค่าใหม่เท่านั้น


4
ขอบคุณมากสำหรับ 'มันคืนเท่านั้นและไม่เปลี่ยนแปลง'! นั่นคือสิ่งที่ฉันกำลังฉีกเส้นผมของฉันเป็นเวลานานจนกระทั่งฉันได้พบกับความคิดเห็นของคุณ ...
Aditya MP

70
string.replace ('เก่า', 'ใหม่') จะแทนที่อินสแตนซ์แรกของ 'เก่า' ในสตริงเท่านั้น การใช้นิพจน์ทั่วไปที่มีการตั้งค่าสถานะ 'g' เหมือนในคำตอบของ realmag777 จะแทนที่อินสแตนซ์ทั้งหมดของสตริง text = text.replace (/ old / g, 'new') จะแทนที่อินสแตนซ์ทั้งหมดของ 'old'
WNRosenberg

1
ไม่คำนึงถึงขนาดตัวพิมพ์
Netorica

7
^ text.replace (/ old / gi, 'new') จะแทนที่อินสแตนซ์ทั้งหมดของ 'old' สำหรับ 'new' ไม่คำนึงถึงขนาดตัวพิมพ์ (เช่น 'OLD' และ 'oLd' จะถูกแทนที่ด้วย)
arnoudhgz

2
และเอกสารบาง
ฉบับ

84

ง่ายขึ้น:

city_name=city_name.replace(/ /gi,'_');

แทนที่ช่องว่างทั้งหมดด้วย '_'!


10
นี่เป็นการแปลที่แม่นยำยิ่งขึ้นว่า "str_replace" ทำอะไร (ทั่วโลก) คำตอบที่เลือกจะแทนที่อินสแตนซ์แรกเท่านั้น
อุดมไปด้วย

1
อย่าลืมที่จะหลบหนีตัวละครโดยเฉพาะอย่างยิ่งถ้าคุณกำลังแทนที่.replace(/\\x3B/g,';')
เลข

18

วิธีการทั้งหมดเหล่านี้ไม่ได้แก้ไขค่าเดิมส่งคืนสตริงใหม่

var city_name = 'Some text with spaces';

แทนที่ช่องว่างที่ 1ด้วย _

city_name.replace(' ', '_'); // Returns: Some_text with spaces

แทนที่ช่องว่างทั้งหมดด้วย _ using regex หากคุณต้องการใช้ regex ฉันขอแนะนำให้ทดสอบด้วยhttps://regex101.com/

city_name.replace(/ /gi,'_');  // Returns: Some_text_with_spaces 

แทนที่ช่องว่างทั้งหมดที่มี _ โดยไม่ต้อง regex วิธีการทำงาน

city_name.split(' ').join('_');  // Returns: Some_text_with_spaces

16

คุณควรเขียนอะไรแบบนั้น:

var text = "this is some sample text that i want to replace";
var new_text = text.replace("want", "dont want");
document.write(new_text);

14

รหัสที่ผู้อื่นให้คุณแทนที่เกิดขึ้นเพียงครั้งเดียวในขณะที่ใช้นิพจน์ทั่วไปแทนที่พวกเขาทั้งหมด (เช่น @sorgit กล่าว) ในการแทนที่ "ต้องการ" ทั้งหมดด้วย "ไม่ต้องการ" ให้เราใช้รหัสนี้:

var text = "this is some sample text that i want to replace";
var new_text = text.replace(/want/g, "dont want");
document.write(new_text);

ตัวแปร "new_text" จะส่งผลให้เกิด "นี่คือข้อความตัวอย่างบางส่วนที่ฉันไม่ต้องการแทนที่"

หากต้องการคำแนะนำสั้น ๆ เกี่ยวกับนิพจน์ทั่วไปไปที่นี่:
http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับstr.replace()ให้ไปที่นี่:
https://developer.mozilla.org/ th-US / docs / JavaScript / ข้อมูลอ้างอิง / Global_Objects / String / แทนที่ขอให้
โชคดี!


14

ฟังก์ชั่นนี้จะแทนที่การเกิดขึ้นเพียงครั้งเดียว .. หากคุณต้องการแทนที่การเกิดขึ้นหลายครั้งคุณควรลองใช้ฟังก์ชั่นนี้: http://phpjs.org/functions/str_replace/527

ไม่จำเป็น. ดูคำตอบของ Hans Kesting:

city_name = city_name.replace(/ /gi,'_');

8

อืม .. คุณตรวจสอบการแทนที่ () หรือไม่

รหัสของคุณจะเป็นแบบนี้

var text = "this is some sample text that i want to replace";
var new_text = text.replace("want", "dont want");
document.write(new_text);


7

ใน JavaScript คุณเรียกใช้replaceเมธอดบนวัตถุ String เช่น"this is some sample text that i want to replace".replace("want", "dont want")ซึ่งจะส่งคืนสตริงที่ถูกแทนที่

var text = "this is some sample text that i want to replace";
var new_text = text.replace("want", "dont want"); // new_text now stores the replaced string, leaving the original untouched

7

JavaScript มีreplace()วิธีการของวัตถุ String สำหรับการแทนที่สารตั้งต้น วิธีนี้สามารถมีสองข้อโต้แย้ง อาร์กิวเมนต์แรกสามารถเป็นสตริงหรือรูปแบบการแสดงออกปกติ (วัตถุ regExp) และอาร์กิวเมนต์ที่สองสามารถเป็นสตริงหรือฟังก์ชั่น ตัวอย่างของreplace()วิธีการที่มีทั้งอาร์กิวเมนต์สตริงแสดงอยู่ด้านล่าง

var text = 'one, two, three, one, five, one';
var new_text = text.replace('one', 'ten');
console.log(new_text)  //ten, two, three, one, five, one

โปรดทราบว่าหากอาร์กิวเมนต์แรกคือสตริงเฉพาะการเกิดครั้งแรกของสตริงย่อยจะถูกแทนที่เช่นเดียวกับในตัวอย่างข้างต้น ในการแทนที่สตริงย่อยที่เกิดขึ้นทั้งหมดคุณต้องระบุนิพจน์ทั่วไปด้วยgแฟล็ก (global) หากคุณไม่ได้ระบุค่าสถานะโกลบอลเฉพาะการเกิดขึ้นครั้งแรกของสตริงย่อยจะถูกแทนที่แม้ว่าคุณจะให้นิพจน์ทั่วไปเป็นอาร์กิวเมนต์แรกก็ตาม ดังนั้นลองมาแทนที่เหตุการณ์ทั้งหมดoneในตัวอย่างข้างต้น

var text = 'one, two, three, one, five, one';
var new_text = text.replace(/one/g, 'ten');
console.log(new_text)  //ten, two, three, ten, five, ten

โปรดทราบว่าคุณไม่ได้ห่อรูปแบบการแสดงออกปกติในเครื่องหมายคำพูดซึ่งจะทำให้มันเป็นสตริงไม่ใช่วัตถุ regExp หากต้องการทำการเปลี่ยนแบบคำนึงถึงขนาดตัวพิมพ์คุณต้องระบุแฟล็กเพิ่มเติมiซึ่งทำให้รูปแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ /one/giในกรณีที่การแสดงออกปกติดังกล่าวข้างต้นจะเป็น สังเกตเห็นการiตั้งค่าสถานะที่นี่

หากอาร์กิวเมนต์ที่สองมีฟังก์ชั่นและหากมีการจับคู่ฟังก์ชั่นจะถูกส่งผ่านด้วยสามข้อโต้แย้ง ข้อโต้แย้งที่ฟังก์ชั่นได้รับคือการแข่งขันตำแหน่งของการแข่งขันและข้อความต้นฉบับ คุณต้องคืนสิ่งที่ควรจะแทนที่ด้วย ตัวอย่างเช่น,

var text = 'one, two, three, one, five, one';
var new_text = text.replace(/one/g, function(match, pos, text){
return 'ten';
});
console.log(new_text) //ten, two, three, ten, five, ten

คุณสามารถควบคุมข้อความแทนที่ได้มากขึ้นโดยใช้ฟังก์ชั่นเป็นอาร์กิวเมนต์ที่สอง


2
คุณเป็นคนเดียวที่กล่าวถึงฟังก์ชั่นภายในความสามารถในการแทนที่
Emeeus

4

คุณสามารถใช้ได้

text.replace('old', 'new')

และหากต้องการเปลี่ยนหลายค่าในหนึ่งสตริงในคราวเดียวตัวอย่างเช่นเปลี่ยน # เป็น string v และ _ เป็น string w:

text.replace(/#|_/g,function(match) {return (match=="#")? v: w;});

3

หากคุณต้องการจริงๆเทียบเท่ากับ PHP คือstr_replaceคุณสามารถใช้Locutus str_replaceตัวเลือกการสนับสนุนเวอร์ชันของ PHP เพิ่มขึ้นดังนั้น JavaScript จึงString.prototype.replaceรองรับ ตัวอย่างแท็ก:

//PHP
$bodytag = str_replace("%body%", "black", "<body text='%body%'>");
//JS with Locutus
var $bodytag = str_replace(['{body}', 'black', '<body text='{body}'>')  

หรือของอาร์เรย์

//PHP
$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");
//JS with Locutus
var $vowels = ["a", "e", "i", "o", "u", "A", "E", "I", "O", "U"];
var $onlyconsonants = str_replace($vowels, "", "Hello World of PHP");

นอกจากนี้ยังไม่ได้ใช้ regex แทนใช้สำหรับลูป หากคุณไม่ต้องการใช้ regex แต่ต้องการแทนที่สตริงแบบง่ายคุณสามารถใช้สิ่งนี้ (ตาม Locutus)

function str_replace (search, replace, subject) {

  var i = 0
  var j = 0
  var temp = ''
  var repl = ''
  var sl = 0
  var fl = 0
  var f = [].concat(search)
  var r = [].concat(replace)
  var s = subject
  s = [].concat(s)

  for (i = 0, sl = s.length; i < sl; i++) {
    if (s[i] === '') {
      continue
    }
    for (j = 0, fl = f.length; j < fl; j++) {
      temp = s[i] + ''
      repl = r[0]
      s[i] = (temp).split(f[j]).join(repl)
      if (typeof countObj !== 'undefined') {
        countObj.value += ((temp.split(f[j])).length - 1)
      }
    }
  }
  return s[0]
}
var text = "this is some sample text that i want to replace";

var new_text = str_replace ("want", "dont want", text)
document.write(new_text)

สำหรับข้อมูลเพิ่มเติมดูซอร์สโค้ดhttps://github.com/kvz/locutus/blob/master/src/php/strings/str_replace.js


2

มีหลายคำตอบโดยใช้str.replace () (ซึ่งยุติธรรมพอสำหรับคำถามนี้) และregexแต่คุณสามารถใช้การรวมกันของstr.split ()และเข้าร่วม ()ร่วมกันซึ่งเร็วกว่าstr.replace()และregexและ

ด้านล่างเป็นตัวอย่างการทำงาน:

var text = "this is some sample text that i want to replace";

console.log(text.split("want").join("dont want"));


2

คุณมีตัวเลือกดังต่อไปนี้:

  1. แทนที่เหตุการณ์แรก

var text = "this is some sample text that i want to replace and this i WANT to replace as well.";
var new_text = text.replace('want', 'dont want');
// new_text is "this is some sample text that i dont want to replace and this i WANT to replace as well"
console.log(new_text)

  1. แทนที่ทั้งหมดที่เกิดขึ้น - กรณีที่สำคัญ

var text = "this is some sample text that i want to replace and this i WANT to replace as well.";
var new_text = text.replace(/want/g, 'dont want');
// new_text is "this is some sample text that i dont want to replace and this i WANT to replace as well
console.log(new_text)

  1. แทนที่สิ่งที่เกิดขึ้นทั้งหมด - ตัวพิมพ์เล็กและตัวพิมพ์เล็ก

var text = "this is some sample text that i want to replace and this i WANT to replace as well.";
var new_text = text.replace(/want/gi, 'dont want');
// new_text is "this is some sample text that i dont want to replace and this i dont want to replace as well
console.log(new_text)

ข้อมูลเพิ่มเติม -> ที่นี่


2

ใน Javascript ให้แทนที่ฟังก์ชั่นที่มีอยู่เพื่อแทนที่สตริงย่อยจากสตริงที่กำหนดด้วยอันใหม่ ใช้:

var text = "this is some sample text that i want to replace";
var new_text = text.replace("want", "dont want");
console.log(new_text);

คุณสามารถใช้การแสดงออกปกติกับฟังก์ชั่นนี้ ตัวอย่างเช่นถ้าต้องการเปลี่ยนที่เกิดขึ้นทั้งหมดด้วย,.

var text = "123,123,123";
var new_text = text.replace(/,/g, ".");
console.log(new_text);

gตัวดัดแปลงที่นี่ใช้เพื่อจับคู่การแข่งขันที่มีอยู่ทั้งหมดทั่วโลก


2

วิธีreplace substring in a sentenceใช้ React:

 const replace_in_javascript = (oldSubStr, newSubStr, sentence) => {
    let newStr = "";
    let i = 0;
    sentence.split(" ").forEach(obj => {
      if (obj.toUpperCase() === oldSubStr.toUpperCase()) {
        newStr = i === 0 ? newSubStr : newStr + " " + newSubStr;
        i = i + 1;
      } else {
        newStr = i === 0 ? obj : newStr + " " + obj;
        i = i + 1;
      }
    });
    return newStr;
  };

RunMethodHere


2

หากคุณไม่ต้องการใช้ regex คุณสามารถใช้ฟังก์ชันนี้ซึ่งจะแทนที่ทั้งหมดในสตริง

รหัสแหล่งที่มา:

function ReplaceAll(mystring, search_word, replace_with) 
{
    while (mystring.includes(search_word))
    {
        mystring = mystring.replace(search_word, replace_with);
    }

    return mystring;  
}

วิธีใช้:

var mystring = ReplaceAll("Test Test", "Test", "Hello"); 

2

ใช้String.prototype.replaceอาร์กิวเมนต์JS แรกควรเป็นรูปแบบ Regex หรือ String และอาร์กิวเมนต์ที่สองควรเป็น String หรือฟังก์ชัน

str.replace(regexp|substr, newSubStr|function);

Ex:

var str = 'this is some sample text that i want to replace'; var newstr = str.replace(/want/i, "dont't want"); document.write(newstr); // this is some sample text that i don't want to replace


0
function str_replace($old, $new, $text)
{
   return ($text+"").split($old).join($new); 
}

คุณไม่ต้องการห้องสมุดเพิ่มเติม


-1

เพิ่มวิธีการreplace_in_javascriptที่จะตอบสนองความต้องการของคุณ นอกจากนี้ยังพบว่าคุณเขียนสตริง"new_text"ในซึ่งควรจะหมายถึงตัวแปรdocument.write()new_text

let replace_in_javascript= (replaceble, replaceTo, text) => {
  return text.replace(replaceble, replaceTo)
}

var text = "this is some sample text that i want to replace";
var new_text = replace_in_javascript("want", "dont want", text);
document.write(new_text);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.