Categories
Javascript

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

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.