Làm cách nào tôi có thể thực hiện một chuỗi thông số trong JavaScript, thay thế văn bản trong JavaScript?


137

Tôi muốn sử dụng str_replacehoặc thay thế tương tự của nó để thay thế một số văn bản trong 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");

nên cho đi

this is some sample text that i dont want to replace

Nếu bạn định regex, ý nghĩa hiệu suất so với các phương pháp thay thế được xây dựng là gì.


3
Lạ không ai nhận thấy rằng PHP str_replacecũng chấp nhận hai mảng có cùng độ dài, trong đó mỗi chuỗi trong mảng đầu tiên được thay thế bằng chuỗi trong mảng thứ hai trong cùng một chỉ mục. Vui lòng xem stackoverflow.com/a/5069776/296430 để biết chức năng chính xác duy nhất mà tôi đã tìm thấy cho đến nay bắt chước hành vi chính xác này trong javascript.
Jules Colle

2
@JulesColle câu trả lời thất bại thường xuyên - xem tại sao / khi nó thất bại và một giải pháp tốt hơn ở đây: stackoverflow.com/a/37949642/445295
Stephen M. Harris

1
Nếu bạn muốn khả năng tương thích cao - bao gồm cả quirks - với phiên bản php ... hãy xem github.com/kvz/locutus/blob/master/src/php/strings/iêu
Doug Coburn

Câu trả lời:


12

Sử dụng regex để thay thế chuỗi chậm hơn đáng kể so với sử dụng thay thế chuỗi.
Như đã trình bày trên JSPerf , bạn có thể có các mức hiệu quả khác nhau để tạo regex, nhưng tất cả chúng đều chậm hơn đáng kể so với thay thế chuỗi đơn giản. Regex chậm hơn vì :

Các kết hợp chuỗi cố định không có quay lại, các bước biên dịch, phạm vi, các lớp ký tự hoặc một loạt các tính năng khác làm chậm công cụ biểu thức chính quy. Chắc chắn có nhiều cách để tối ưu hóa các trận đấu regex, nhưng tôi nghĩ không thể đánh bại việc lập chỉ mục thành một chuỗi trong trường hợp phổ biến.

Đối với một thử nghiệm đơn giản trên trang hoàn hảo của JS, tôi đã ghi lại một số kết quả:

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

Kết quả cho Chrome 68 như sau:

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

Từ sự hoàn chỉnh của câu trả lời này (mượn từ các bình luận), điều đáng nói là .replacechỉ thay thế phiên bản đầu tiên của nhân vật phù hợp. Nó chỉ có thể thay thế tất cả các trường hợp với //g. Sự đánh đổi hiệu năng và sự tao nhã của mã có thể được tranh luận là tồi tệ hơn nếu thay thế nhiều trường hợp name.replace(' ', '_').replace(' ', '_').replace(' ', '_');hoặc tệ hơnwhile (name.includes(' ')) { name = name.replace(' ', '_') }


Đó là điều thú vị và có ý nghĩa rằng chuỗi thay thế thuần túy nhanh hơn regex. Có lẽ đáng để đề cập (như trong một số câu trả lời) .replacechỉ thay thế phiên bản đầu tiên của nhân vật phù hợp. Nó chỉ có thể thay thế tất cả các trường hợp với //g. Sự đánh đổi hiệu suất có thể được tranh luận là tồi tệ hơn nếu thay thế nhiều trường hợp name.replace(' ', '_').replace(' ', '_').replace(' ', '_');hoặc tệ hơnwhile (name.includes(' ')) { name = name.replace(' ', '_') }
Lex

201

Bạn sẽ sử dụng replacephương pháp:

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

Đối số đầu tiên là những gì bạn đang tìm kiếm, rõ ràng. Nó cũng có thể chấp nhận các biểu thức thông thường.

Chỉ cần nhớ rằng nó không thay đổi chuỗi ban đầu. Nó chỉ trả về giá trị mới.


4
Cảm ơn rất nhiều vì 'nó chỉ trở lại và không thay đổi'! Đó là những gì tôi đã xé tóc trong một thời gian dài cho đến khi tôi thấy bình luận của bạn ...
Aditya MP

70
chuỗi.replace ('cũ', 'mới') sẽ chỉ thay thế phiên bản đầu tiên của 'cũ' trong chuỗi. sử dụng biểu thức chính quy với cờ 'g' như trong câu trả lời của realmag777 sẽ thay thế tất cả các phiên bản của chuỗi. text = text.replace (/ old / g, 'new') sẽ thay thế tất cả các phiên bản của 'cũ'
WNRosenberg

1
Làm thế nào về không nhạy cảm trường hợp?
Netorica

7
^ text.replace (/ old / gi, 'new') sẽ thay thế tất cả các trường hợp 'cũ' thành 'mới' không phân biệt chữ hoa chữ thường (ví dụ 'OLD' và 'oLd' cũng sẽ được thay thế)
arnoudhgz

2
và một số tài liệu với điều đó: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
Kẻ

84

Đơn giản hơn:

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

Thay thế tất cả các khoảng trắng bằng '_'!


10
đây là bản dịch chính xác hơn về những gì "str numplace" làm (toàn cầu). Câu trả lời được chọn sẽ chỉ thay thế phiên bản đầu tiên.
rICh

1
Đừng quên thoát các ký tự, đặc biệt nếu bạn thay thế hex đã thoát: \ x27 chẳng hạn sẽ là.replace(/\\x3B/g,';')
dmayo

18

Tất cả các phương thức này không sửa đổi giá trị ban đầu, trả về chuỗi mới.

var city_name = 'Some text with spaces';

Thay thế không gian thứ 1 bằng _

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

Thay thế tất cả các khoảng trắng bằng _ bằng regex. Nếu bạn cần sử dụng regex, thì tôi khuyên bạn nên thử nghiệm nó với https://regex101.com/

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

Thay thế tất cả các không gian bằng _ không có regex . Cách chức năng.

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

16

Bạn nên viết một cái gì đó như thế:

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

Mã mà người khác đang cung cấp cho bạn chỉ thay thế một lần xuất hiện, trong khi sử dụng các biểu thức thông thường sẽ thay thế tất cả (như @sorgit đã nói). Để thay thế tất cả "muốn" bằng "không muốn", hãy sử dụng mã này:

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

Biến "new lòng" sẽ dẫn đến "đây là một số văn bản mẫu mà tôi không muốn thay thế".

Để có hướng dẫn nhanh về các biểu thức thông thường, hãy truy cập tại đây:
http://www.cheatography.com/davechild/cheat-sheet/THER-expressions/
Để tìm hiểu thêm về str.replace(), hãy truy cập tại đây:
https://developer.mozilla.org/ vi-US / docs / JavaScript / Reference / Global_Objects / String / thay thế
Chúc may mắn!


14

chức năng đó chỉ thay thế một lần xuất hiện .. nếu bạn cần thay thế nhiều lần xuất hiện, bạn nên thử chức năng này: http://phpjs.org/fifts/str numplaceplace27

Không cần thiết. xem câu trả lời của Hans Kesting:

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

8

hm .. Bạn đã kiểm tra thay thế ()?

Mã của bạn sẽ trông như thế này

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

Trong JavaScript, bạn gọi replacephương thức trên đối tượng String, ví dụ "this is some sample text that i want to replace".replace("want", "dont want"), sẽ trả về chuỗi đã thay thế.

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 có replace()phương thức của đối tượng String để thay thế các chuỗi con. Phương pháp này có thể có hai đối số. Đối số đầu tiên có thể là một chuỗi hoặc một mẫu biểu thức chính quy (đối tượng regExp) và đối số thứ hai có thể là một chuỗi hoặc một hàm. Một ví dụ về replace()phương thức có cả hai đối số chuỗi được hiển thị bên dưới.

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

Lưu ý rằng nếu đối số đầu tiên là chuỗi, chỉ có sự xuất hiện đầu tiên của chuỗi con được thay thế như trong ví dụ trên. Để thay thế tất cả các lần xuất hiện của chuỗi con, bạn cần cung cấp biểu thức chính quy bằng gcờ (toàn cầu). Nếu bạn không cung cấp cờ toàn cầu, chỉ có sự xuất hiện đầu tiên của chuỗi con sẽ được thay thế ngay cả khi bạn cung cấp biểu thức chính quy làm đối số đầu tiên. Vì vậy, hãy thay thế tất cả các lần xuất hiện onetrong ví dụ trên.

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

Lưu ý rằng bạn không gói mẫu biểu thức chính quy trong dấu ngoặc kép sẽ làm cho nó thành một chuỗi không phải là đối tượng regExp. Để thực hiện thay thế không phân biệt chữ hoa chữ thường, bạn cần cung cấp thêm cờ ilàm cho mẫu không phân biệt chữ hoa chữ thường. Trong trường hợp đó, biểu thức chính quy ở trên sẽ là /one/gi. Chú ý icờ được thêm vào đây.

Nếu đối số thứ hai có hàm và nếu có khớp thì hàm được truyền với ba đối số. Các đối số mà hàm nhận được là khớp, vị trí của khớp và văn bản gốc. Bạn cần trả lại những gì phù hợp nên được thay thế bằng. Ví dụ,

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

Bạn có thể có nhiều quyền kiểm soát hơn đối với văn bản thay thế bằng cách sử dụng hàm làm đối số thứ hai.


2
Bạn là người duy nhất đề cập đến chức năng bên trong khả năng thay thế
Emeeus 7/07/18

4

Bạn có thể dùng

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

Và để thay đổi nhiều giá trị trong một chuỗi cùng một lúc, ví dụ: thay đổi # thành chuỗi v và _ thành chuỗi w:

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

3

Nếu bạn thực sự muốn tương đương với PHP, str_replacebạn có thể sử dụng Locutus . Phiên bản PHP str_replacehỗ trợ thêm tùy chọn sau đó những gì JavaScript String.prototype.replacehỗ trợ. Ví dụ thẻ:

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

hoặc mảng

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

Ngoài ra, điều này không sử dụng regex thay vào đó nó sử dụng cho các vòng lặp. Nếu bạn không muốn sử dụng regex nhưng muốn thay thế chuỗi đơn giản, bạn có thể sử dụng cái gì đó như thế này (dựa trên 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)

để biết thêm thông tin, hãy xem mã nguồn https://github.com/kvz/locutus/blob/master/src/php/strings/str numplace.js


2

Đã có nhiều câu trả lời bằng cách sử dụng str.replace () (đủ công bằng cho câu hỏi này) và regexbạn có thể sử dụng kết hợp str.split ()nối () với nhau nhanh hơn str.replace()regex .

Dưới đây là ví dụ làm việc:

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

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


2

Bạn có các tùy chọn sau:

  1. Thay thế lần đầu tiên

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. Thay thế tất cả các lần xuất hiện - trường hợp nhạy cảm

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. Thay thế tất cả các lần xuất hiện - trường hợp không nhạy cảm

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)

Thêm thông tin -> tại đây


2

Trong Javascript, thay thế chức năng có sẵn để thay thế chuỗi con từ chuỗi đã cho bằng chuỗi mới. Sử dụng:

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

Bạn thậm chí có thể sử dụng biểu thức chính quy với chức năng này. Ví dụ, nếu muốn thay thế tất cả các lần xuất hiện ,bằng ..

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

Ở đây gsửa đổi được sử dụng để phù hợp trên toàn cầu tất cả các trận đấu có sẵn.


2

Phương pháp replace substring in a sentencesử dụng 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

Nếu bạn không muốn sử dụng regex thì bạn có thể sử dụng chức năng này sẽ thay thế tất cả trong một chuỗi

Mã nguồn:

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

    return mystring;  
}

Cách sử dụng:

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

2

Sử dụng String.prototype.replaceđối số đầu tiên của JS phải là mẫu Regex hoặc Chuỗi và đối số thứ hai phải là Chuỗi hoặc hàm.

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

Ví dụ:

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); 
}

Bạn không cần thêm thư viện.


-1

Đã thêm một phương pháp replace_in_javascriptsẽ đáp ứng yêu cầu của bạn. Cũng thấy rằng bạn đang viết một chuỗi "new_text"trong document.write()đó được cho là đề cập đến một biến 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);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.