Search code examples
javascriptreplacereplaceall

Search and replacing strings without using Regex but loops instead, how can I replace more than one word at a time?


I found a way to do string search and replace without using Regex but when I want to replace more than one instance it does it one out at time instead of all instances at the same time. How can I get the loop to work?

'use strict'

function main() {
  document.addEventListener('DOMContentLoaded', function() {
    document.getElementById('replace').addEventListener('click', replace);
    document.getElementById('replaceAll').addEventListener('click', replaceAll);
  });

}

function replace(evnt) {
  evnt.preventDefault()
  let userText = document.getElementById('input').value;
  let search = document.getElementById('search').value;
  let replaceText = document.getElementById('replaceText').value;
  let caseSensitive = document.getElementById('case').checked;
  document.getElementById('input').value = userText.replace(search, replaceText);

}

function replaceAll(evnt) {
  evnt.preventDefault();
  let userText = document.getElementById('input').value;
  let search = document.getElementById('search').value;
  let replaceText = document.getElementById('replaceText').value;

  for (let r = 0; r < userText.indexOf(search); r++) {
    document.getElementById('input').value = userText.replace(search, replaceText);
    console.log(r);

  }
}
<form id="form">
  <div>
    <textarea id="input" row="10" cols="50" placeholder="Enter text here"></textarea>
  </div>
  <div>
    <input type="text" id="search" name="search">
    <input type="text" id="replaceText" name="replacebox">
  </div>
  <div>
    <input type="checkbox" id="case" name="case sensitivity" />
    <label for="uppercase">case sensitivity</label>
  </div>
  <div>
    <button type="submit" id="replace">Replace</button>
  </div>
  <div>
    <button type="submit" id="replaceAll">Replace all</button>
  </div>
</form>


Solution

  • In

    for(let r = 0; r < userText.indexOf(search);r++) {
        document.getElementById('input').value = userText.replace(search, replaceText);
    }
    

    On every iteration, you're taking the userText string and replacing one substring inside it. You're not taking the replaced string from the prior iteration; you're taking the original string, so in the end, no more than one replacement, at most, will have been made.

    Reassign a variable instead, perhaps userText, then assign to the input after the loop is done:

    for(let r = 0; r < userText.indexOf(search);r++) {
        userText = userText.replace(search, replaceText);
    }
    document.getElementById('input').value = userText;
    

    Could also use .includes, it's more intuitive:

    while (userText.includes(search)) {
      userText = userText.replace(search, replaceText);
    }
    

    'use strict'
    
    function main() {
      document.addEventListener('DOMContentLoaded', function() {
        document.getElementById('replace').addEventListener('click', replace);
        document.getElementById('replaceAll').addEventListener('click', replaceAll);
      });
    
    }
    
    function replace(evnt) {
      evnt.preventDefault()
      let userText = document.getElementById('input').value;
      let search = document.getElementById('search').value;
      let replaceText = document.getElementById('replaceText').value;
      let caseSensitive = document.getElementById('case').checked;
      document.getElementById('input').value = userText.replace(search, replaceText);
    
    }
    
    function replaceAll(evnt) {
      evnt.preventDefault();
      let userText = document.getElementById('input').value;
      let replaceText = document.getElementById('replaceText').value;
      while (userText.includes(search.value)) {
        userText = userText.replace(search.value, replaceText);
      }
      input.value = userText;
    }
    const [repButton, repAllButton] = document.querySelectorAll('button');
    repButton.onclick = replace;
    repAllButton.onclick = replaceAll;
    <form id="form">
      <div>
        <textarea id="input" row="10" cols="50" placeholder="Enter text here">abcabc</textarea>
      </div>
      <div>
        <input type="text" id="search" name="search" value="abc">
        <input type="text" id="replaceText" name="replacebox" value="123">
      </div>
      <div>
        <input type="checkbox" id="case" name="case sensitivity" />
        <label for="uppercase">case sensitivity</label>
      </div>
      <div>
        <button type="submit" id="replace">Replace</button>
      </div>
      <div>
        <button type="submit" id="replaceAll">Replace all</button>
      </div>
    </form>