2011-01-24 3 views
4

Я хочу заменить несколько слов в тексте, используя replace() в javascript, как я могу это сделать?Как заменить несколько слов в javascript

Например, если я хочу заменить, «Дэйв Чемберс, Дэвид Чемберс, Уилл Смит» с «Джеки Чан», независимо от того, если они находятся в верхнем или нижнем регистре , я должен продолжать повторять replace() метод на одной и той же строки переменной каждый раз, т.е.

var str = sometext.innerHTML; 
str.replace('Dave Chambers', 'Jackie Chan'); 
str.replace('David Chambers', 'Jackie Chan'); 
str.replace('Will Smith', 'Jackie Chan'); 
+0

Дубликат: http://stackoverflow.com/questions/832257/javascript-multiple-replace –

ответ

12

Используйте регулярное выражение с генератором (|) и без учета регистра модификатора (/i):

var str = sometext.innerHTML, 
    reg = /Dave Chambers|David Chambers|Will Smith/i; 

str = str.replace(reg, "Jackie Chan"); 

Более короткий, более сложное регулярное выражение может быть:

/Dav(?:e|id) Chambers|Will Smith/i; 

И если может быть больше, чем 1 возникновение, добавить глобальный модификатор (g), чтобы заменить все:

/Dav(?:e|id) Chambers|Will Smith/ig; 

Вы можете узнать больше о регулярных выражениях here или найти Google. Вы можете увидеть рабочую демонстрацию here.

+3

Hurray для регулярных выражений? – Blender

+1

Можно ли одновременно заменить каждое слово другим словом (например, заменить «Джеки Чана» на «Уилл Смит» и заменить «Уилл Смит» на «Джеки Чан»?) –

1

Вы хотите использовать регулярные выражения, если вы хотите игнорировать случай:

var str = sometext.innerHTML; 
str.replace(/Dave Chambers/ig, 'Jackie Chan') 
    .replace(/David Chambers/ig, 'Jackie Chan') 
    .replace(/Will Smith/ig, 'Jackie Chan'); 

Вы можете сделать все это в одном операторе, как выше, и это, как я предпочел бы, как это более читаемым.

+0

(A) no необходимо вызвать «заменить» три раза (B), регулярные выражения ограничены косой чертой, а не обратными косыми чертами. – Pointy

+0

(A) нет причин не делать (B) Я поймал это, не нужно отрицать ответ за опечатку. – Sparafusile

2
str.replace(/(Dav(e|id) Chambers)|(Will Smith)/ig, 'Jackie Chan'); 
1

Эта функция заменяет любые слова, которые вы хотите в строке.

function wordInString(s, words, replacement){ 
    var re = new RegExp('\\b' + words.join('|') + '\\b','gi'); 
    return s.replace(re, replacement); 
} 

// usage: 
var str = 'did you, or did you not, get why?'; 
str = wordInString(str, ['YOU', 'get'], 'XXX'); 

console.log(str); // "did XXX, or did XXX not, XXX why?" 
+0

Это сработало для меня, чтобы заменить одно или несколько слов, спасибо! Я ответила на этот ответ. – emotality

0

vsync's answer помогли мне выделить слово в целом innerHTML. Это может быть использовано для вопроса и для многих других вещей, спасибо!

function highlightWord(word) { 
    // get your current div content by id 
    var string = document.getElementById('your-id').innerHTML; 

    // set word to highlight 
    var newWord = '<mark>' + word + '</mark>'; 

    // do replacement with regular expression 
    var allWords = new RegExp('\\b' + word + '\\b','gi'); 
    var newString = string.replace(allWords, newWord); 

    // set your new div content by id 
    document.getElementById('your-id').innerHTML = newString; 
}; 
0

Если вы хотите, чтобы какой-либо массив заменил массив, соблюдая разделители типа "." или ",", я создал нечто подобное, что может вам помочь.

function arrayReplace(text, arrFrom, arrTo, caseSensitive) { 
 
    return text. 
 
    replace(/</g," <<"). 
 
    replace(/>/g,">> "). 
 
    replace(/([\.\;\,])/g," <$1> "). 
 
    split(" "). 
 
    map(
 
     function(value) { 
 
     var pos = arrFrom.indexOf(caseSensitive ? value : value.toLowerCase()); 
 
     if(pos == -1) { 
 
      return value; 
 
     } else { 
 
      return arrTo[pos % arrTo.length]; 
 
     } 
 
     } 
 
    ). 
 
    join(" "). 
 
    replace(/(\<|\>)/g,""); 
 
}; 
 

 
console.log( 
 
    arrayReplace(
 
    "First example. Trivial case", 
 
    [ "example", "case"], 
 
    [ "demo", "test" ] 
 
) 
 
); // First demo. Trivial test 
 

 
console.log( 
 
    arrayReplace(
 
    "Leaving earth, passing close to the sun, going to the moon.", 
 
    [ "earth", "sun", "moon"], 
 
    [ "EARTH", "SUN", "MOON"] 
 
) 
 
); // Leaving EARTH, passing close to the SUN, going to the MOON. 
 

 
console.log( 
 
    arrayReplace(
 
    "Leaving earth, passing close to the sun, going to the moon.", 
 
    [ "earth", "sun", "moon"], 
 
    [ "PLANET"] 
 
) 
 
); // Leaving PLANET, passing close to the PLANET, going to the PLANET. 
 

 
console.log( 
 
    arrayReplace(
 
    "Leaving earth, passing close to the sun, going to the moon.", 
 
    [ "earth", "sun", "moon"], 
 
    [ "PLANET", "STAR" ] 
 
) 
 
); // Leaving PLANET, passing close to the STAR, going to the PLANET. 
 

 
console.log( 
 
    arrayReplace(
 
    "Rain rain, goes away, no one wants you any way.", 
 
    [ "rain", "a"], 
 
    [ "pig", "x"] 
 
) 
 
); 
 
// pig pig, goes away, no one wants you any way. 
 

 
console.log( 
 
    arrayReplace(
 
    "Testing the <<function>>. Replacing, in <any> case. Even <the ;funny; ones>.", 
 
    [ "funny", "even", "function" ], 
 
    [ "complex", "including", "code" ] 
 
) 
 
); // Testing the <<code>>. Replacing, in <any> case. including <the ;complex; ones>.

Смежные вопросы