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>
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>