Vấn đề hàm String.replace() của javascript chỉ replace một lần mà thôi.

trong danh mục Javascript

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

?Download Download.txt
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:

?Download Download.txt
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:

?Download Download.txt
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

?Download Download.txt
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.

17 bình luận

  1. alert(myString.split(‘my’).join(‘his’));
    – Có gì chỉ giáo thêm nha các bạn

    [Reply]

    admin Reply:

    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]

  2. Responses to “Vấn đề hàm String.replace() của javascript chỉ replace một lần mà thôi.” says:

    Vẫn dùng hàm replace() được. Theo cách này nhé:
    myString.replace(/my/g, ‘his’);

    [Reply]

    admin Reply:

    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]

  3. Tieubavuong says:

    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]

  4. DongMT says:

    Cảm ơn bạn về bài viết.

    [Reply]

  5. Luong says:

    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]

  6. Hieu Vo says:

    Thuật toán trên sẽ sai nếu replace “my” bằng “mymy”

    [Reply]

  7. Chung says:

    http://www.w3schools.com/jsref/jsref_obj_regexp.asp

    Bạn có thể dynamic parameter được đấy.

    [Reply]

  8. Mẫn says:

    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:

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

  9. wizkyz says:

    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]

  10. wizkyz says:

    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]

  11. Nam says:

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

    [Reply]

  12. Nguyen Duy phuong says:

    Cám ơn bạn, đang cần 🙂

    [Reply]

  13. KTung says:

    thank chú, bài nầy đk đấy

    [Reply]

Gởi bình luận