Tình cờ phát hiện hàm String.replace() của javascript chỉ replace lần xuất hiện đầu tiên mà thôi. Ví dụ:
var myString = 'my blog of my friend here';
alert(myString.replace('my', 'his')); //output : "his blog of my friend here" . Not "his blog of his friend here".
xem ví dụ cũng đã hiểu, phrase “my” chỉ bị thay thế một lần mà thôi, hix hix..điều này đôi khi bạnkhông muốn vì đã replace thì replace cho hết luôn chứ (ví dụ như hàm str_replace() của PHP sẽ thay thế toàn bộ)
– Để giải quyết vấn đề này trước mắt mình thấy có 2 cách, cách hay sử dụng nhất là sử dụng regex pattern thay cho search string, mình sửa lại như sau thì sẽ có kết quả như ý muốn:
alert(myString.replace(/my/g, 'his')); //output : "his blog of his friend here".
Trong nhiều trường hợp mình không dùng cách sử dụng pattern được, thì có một giải pháp khác, đó là add thêm hàm replaceAll vào String object để sau này dùng. Cái hàm này chôm của một kiếm khách nào đó trên giang hồ. Cách này nên sử dụng cẩn thận, vì có thể sẽ bị infinitive loop nếu dùng không cẩn thận.
Prototype của nó như sau:
// Replaces all instances of the given substring.
String.prototype.replaceAll = function(
strTarget, // The substring you want to replace
strSubString // The string you want to replace in.
){
var strText = this;
var intIndexOfMatch = strText.indexOf( strTarget );
// Keep looping while an instance of the target string
// still exists in the string.
while (intIndexOfMatch != -1){
// Relace out the current instance.
strText = strText.replace( strTarget, strSubString )
// Get the index of any next matching substring.
intIndexOfMatch = strText.indexOf( strTarget );
}
// Return the updated string with ALL the target strings
// replaced out with the new substring.
return( strText );
}
Sau khi khai báo prototype này, thì bạn chỉ cần sử dụng như sau
alert(myString.replaceAll('my', 'his')); //output : "his blog of his friend here".
———-
Hy vọng chút ít kinh nghiệm sẽ giúp các bạn trong tương lai.
alert(myString.split(‘my’).join(‘his’));
– Có gì chỉ giáo thêm nha các bạn
Cảm ơn giải pháp của bạn. Có lẽ giải pháp này trông dễ hiểu hơn nhiều nhỉ! Không biết đã có ai test performace của cách replaceAll kia và cách split&join chưa. Theo sự phán đoán của mình thì cách split join hình như sẽ chậm hơn xíu nhỉ bởi vì mình nghĩ thằng split có thể nó cũng đã sử dụng thuật toán tìm chuỗi ở trong triển khai của nó. Dù sao cũng thank bạn đã chia sẽ.
Vẫn dùng hàm replace() được. Theo cách này nhé:
myString.replace(/my/g, ‘his’);
Sử dụng Regex trong replace dạng này chỉ dành cho fix string chứ không thể truyền vào biến để search và replace. Thanks.
Mình sử dụng hàm
myString.replace(/my/g, ‘his’);
Nhưng trong trường hợp mình muốn thay đổi ký tự / thành – thì mình phải viết câu lệnh replace thế nào nhỉ 😀
ví dụ:
https://bloghoctap.com/lap-trinh-javascript/van-de-ham-string-replace-cua-javascript-chi-replace-mot-lan-ma-thoi.html
Trở thành
http:–bloghoctap.com-lap-trinh-javascript-van-de-ham-string-replace-cua-javascript-chi-replace-mot-lan-ma-thoi.html
thanks.
Cảm ơn bạn về bài viết.
Tớ không ủng hộ lắm cách viết trên, rõ ràng mình viết về hàm str..replace mà cứ chuyển sang giới thiệu hàm khác.
Bình thường khi gặp vấn đề cần thay thế một kí tự mã hóa bằng một ký tự giải mà tớ vẫn viết như sau trong mã javascript
function giaima(text,code,decode)
{
do
{
var old_text =text;
text=text.replace(code,decode);
}while(old_text != text)
return text;
}
Thuật toán trên sẽ sai nếu replace “my” bằng “mymy”
http://www.w3schools.com/jsref/jsref_obj_regexp.asp
Bạn có thể dynamic parameter được đấy.
Trường hợp mình đưa ra mới khó đây :
Ví dụ ta có đoạn text : Xin-Chào-Bạn
Bạn làm sao replace “-” thành ” – ” nhé.
Nếu dùng hàm có sử dụng “while” thì sẽ chạy mãi mãi.
Còn Regex thì không được vì mình muốn lập 1 danh sách biến các từ cần thay thế không riêng gì dấu “-“.
Xin giúp đở. Cảm ơn các bạn trước.
@Mẫn, Chào các bạn, Mình vừa đặt câu hỏi trên và mình cũng đã mò ra luôn rồi.
Code của mình sẽ khắc phục được 2 vấn đề
1. While sẽ chạy mãi
2. Regex chỉ replace fix string
Code của mình đây
function ManMan89_Replace(a,b,content){
eval(“var data = content.replace(/”+a+”/g,'”+b+”‘);”);
return data;
}
alert(ManMan89_Replace(“-“,” – “,”Mình-Là-ManMan89-http://khuvuonxanh.co.cc”));
Thank nhiều
var str=”Tester Tester Tester Tester Tester Tester “;
var x = “Tester”;
var b;
var patt=new RegExp(x,”g”);
b = str.replace(patt, “wizkyz”);
document.write(b);
—————————-
thử cái này thử các bạn 🙂
var str=”Tester Tester Tester Tester Tester Tester “;
var x = [“Tester”,”Hanger”];
var b;
var patt=new RegExp(x[0],”g”);
var c = [“Wizkyz”,”To”];
b = str.replace(patt, c[0]);
document.write(b);
code test của mình có thể sử dụng mảng 😉
Hi
Anh đang có 1 việc làm (có kinh phí) liên quan đến Regex HTML, cần chuyên gia có kinh nghiệm xử lý.
Em gọi điện thoại cho anh theo số 0934188989
hoặc skype nam.truongthanh
để trao đổi chi tiết nhé.
Cám ơn bạn, đang cần 🙂
thank chú, bài nầy đk đấy
cho mình hỏi !=-1 là như nào ?