โซลูชันเฉพาะ
คุณสามารถใช้ฟังก์ชั่นเพื่อแทนที่แต่ละอัน
var str = "I have a cat, a dog, and a goat.";
var mapObj = {
cat:"dog",
dog:"goat",
goat:"cat"
};
str = str.replace(/cat|dog|goat/gi, function(matched){
return mapObj[matched];
});
ตัวอย่าง jsfiddle
การสรุปมัน
ถ้าคุณต้องการที่จะรักษา regex แบบไดนามิกและเพียงแค่เพิ่มการแลกเปลี่ยนในอนาคตไปที่แผนที่คุณสามารถทำได้
new RegExp(Object.keys(mapObj).join("|"),"gi");
เพื่อสร้าง regex ดังนั้นมันจะเป็นแบบนี้
var mapObj = {cat:"dog",dog:"goat",goat:"cat"};
var re = new RegExp(Object.keys(mapObj).join("|"),"gi");
str = str.replace(re, function(matched){
return mapObj[matched];
});
และเพื่อเพิ่มหรือเปลี่ยนแปลงการแทนที่ใด ๆ เพิ่มเติมคุณสามารถแก้ไขแผนที่ได้
ซอกับ regex แบบไดนามิก
ทำให้มันสามารถใช้ซ้ำได้
หากคุณต้องการให้สิ่งนี้เป็นรูปแบบทั่วไปคุณสามารถดึงฟังก์ชันนี้ออกเป็นแบบนี้ได้
function replaceAll(str,mapObj){
var re = new RegExp(Object.keys(mapObj).join("|"),"gi");
return str.replace(re, function(matched){
return mapObj[matched.toLowerCase()];
});
}
จากนั้นคุณสามารถส่ง str และแผนที่ของการแทนที่ที่คุณต้องการไปยังฟังก์ชันและมันจะคืนค่าสตริงที่แปลงแล้ว
ซอที่มีฟังก์ชั่น
เพื่อให้แน่ใจว่า Object.keys ทำงานในเบราว์เซอร์รุ่นเก่าเพิ่ม polyfill เช่นจากMDNหรือES5