Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to replace multiple keywords by corresponding keywords with the `replace` method?

Tags:

I want to make a content editable div in which I replace explicit words with asterisks. This is my JavaScript code:

function censorText(){     var explicit = document.getElementById("textbox").innerHTML;     var clean = explicit.replace(/"badtext1","cleantext1"|"badtext2","cleantext2"/);     document.getElementById("textbox").innerHTML = clean; } 

Here’s the HTML for my <div contenteditable>:

<div contenteditable="true" onkeyup="censorText()" id="textbox">Hello!</div> 

As you can see, I tried using a regex operator to replace multiple strings at once, but it doesn’t work. It doesn’t replace badtext2 with cleantext2, and it replaces badtext1 with 0. How can I make a single .replace() statement replace multiple strings?

like image 665
Shrey Gupta Avatar asked Dec 23 '12 17:12

Shrey Gupta


2 Answers

use /.../g to indicate a global replace.

var clean = explicit.replace(/badtext1/g,"cleantext2"/).replace(/cleantext1/g,"cleantext2"/).replace(/badtext2/g,"cleantext2"/); 
like image 187
coderLMN Avatar answered Sep 28 '22 04:09

coderLMN


A generic way to handle this is as follows:

Establish a dictionary and build a regexp:

  var dictionary = { bad: 'good', worse: 'better', awful: 'wonderful'},       regexp = RegExp ('\\b(' + Object.keys (dictionary).join ('|') + ')\\b', 'g'); 

The regexp is constructed from the dictionary key words (note they must not contain RegExp special characters).

Now do a replace, using a function in the place of the replacing string, the function simply return the value of the corresponding key.

  text = text.replace (regexp, function (_, word) { return dictionary[word]; }); 

The OP made no reference to upper/lower case. The following caters for initial and all caps and wraps the code as a function :

  function clean (text) {     var dictionary = { bad: 'good', worse: 'better', awful: 'wonderful'},         regexp = RegExp ('\\b(' + Object.keys (dictionary).join ('|') + ')\\b', 'ig');      return text.replace (regexp, function (_, word) {        _ = dictionary[word.toLowerCase ()];       if (/^[A-Z][a-z]/.test (word)) // initial caps         _ = _.slice (0,1).toUpperCase () + _.slice (1);       else if (/^[A-Z][A-Z]/.test (word)) // all caps         _ = _.toUpperCase ();       return _;     });   } 

See the fiddle : http://jsfiddle.net/nJNq2/

like image 24
HBP Avatar answered Sep 28 '22 02:09

HBP