Vấn đề hàm String.replace() của javascript chỉ replace một lần mà thôi.
Đăng trong danh mục Javascript bởi admin | Tags: Javascript, jquery, PHP, prototype, regex, string
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ụ:
1 2 3 | 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:
1 | 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | // 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
1 | 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.
Bài viết liên quan:
14 Lời bình cho bài viết “Vấn đề hàm String.replace() của javascript chỉ replace một lần mà thôi.”
Viết lời bình
Bình luận mới nhất
- Cấu hình domain ảo ở localhost
"Chào Cho mình hỏi mình co 1 server window dang chay IIS web asp.net " - Minh Phuong - dotProject - Online Project Management
"@tùng, lỗi quá rõ ràng rồi " - admin - dotProject - Online Project Management
"mình install báo lỗi: not create database.Mình không biết xử lý thế nà" - tùng - Review sách: Hiểu về trái tim - Minh Niệm
"may ban cho minh hoi la : minh nho` nguoi nha di mua sach dum, vi minh" - Tracy - Làm IT nên đọc ebook của nhà xuất bản nào?
"@Lê Hoàng Dũng, Mình cũng" - long - Hội thảo: Heavy Web Optimization – Back-end
"Đã là slide thì sao mà chi tiết được, thế mới gọi là thuyết trình chứ," - DaiGiaCaiBang - Hội thảo: Heavy Web Optimization – Back-end
"Nếu có thể thì anh Tuấn nên viết slide chi tiết hơn tí để mọi người kh" - ichuot - FBNC - Kênh truyền hình TPHCM "pro" nhất hiện nay!
"neu ban dung cap SCTV, ban co the xem SCTV8, day la kenh VITV phat son" - nga - Xây dựng PHP Framework "Made in tự tui"
"Em chào cả nhà ạ. Em xin hỏi 1 chút: Khi em làm 1 website bán hàng t" - mrgun - Review sách: Hiểu về trái tim - Minh Niệm
"hay lam!y nghia that" - rua con_A1
Danh mục
- android (3)
- Business (24)
- Flash (1)
- Graphic Design (16)
- IT Guys (1)
- Javascript (9)
- Miscellaneous (58)
- Photography (9)
- PHP (41)
- Review sách (13)
- Search Engine Optimization (2)
- security (3)
- software (5)
- User Interface Design & Usability (8)
- Web Design (28)
- Web Programming (50)
Lưu trữ
- May 2012 (1)
- March 2012 (2)
- February 2012 (1)
- January 2012 (1)
- December 2011 (1)
- November 2011 (2)
- September 2011 (2)
- August 2011 (1)
- July 2011 (4)
- June 2011 (2)
- May 2011 (2)
- April 2011 (2)
- March 2011 (2)
- February 2011 (2)
- January 2011 (4)
- December 2010 (6)
- November 2010 (3)
- October 2010 (3)
- September 2010 (5)
- August 2010 (6)
- July 2010 (5)
- June 2010 (2)
- May 2010 (5)
- April 2010 (7)
- March 2010 (8)
- February 2010 (4)
- January 2010 (10)
- December 2009 (12)
- November 2009 (12)
- October 2009 (15)
- September 2009 (16)
- August 2009 (11)
- July 2009 (15)
- November 2008 (1)
- October 2008 (1)
- September 2008 (3)


November 10, 2009 at 9:33 am
alert(myString.split(‘my’).join(‘his’));
- Có gì chỉ giáo thêm nha các bạn
[Reply]
admin Reply:
November 10th, 2009 at 10:40 am
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ẽ.
[Reply]
December 7, 2009 at 9:10 am
Vẫn dùng hàm replace() được. Theo cách này nhé:
myString.replace(/my/g, ‘his’);
[Reply]
admin Reply:
December 7th, 2009 at 10:04 am
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.
[Reply]
December 22, 2009 at 3:01 pm
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ụ:
http://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.
[Reply]
March 17, 2010 at 9:34 am
Cảm ơn bạn về bài viết.
[Reply]
August 5, 2010 at 9:26 pm
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;
}
[Reply]
April 1, 2011 at 2:45 pm
Thuật toán trên sẽ sai nếu replace “my” bằng “mymy”
[Reply]
May 11, 2011 at 5:04 pm
http://www.w3schools.com/jsref/jsref_obj_regexp.asp
Bạn có thể dynamic parameter được đấy.
[Reply]
June 28, 2011 at 11:53 am
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.
[Reply]
Mẫn Reply:
June 28th, 2011 at 12:18 pm
@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”));
[Reply]
August 26, 2011 at 8:10 am
Thank nhiều
[Reply]
March 18, 2012 at 3:27 pm
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
[Reply]
March 18, 2012 at 3:30 pm
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
[Reply]