Muranx
@Muranx
кто понял this тот в цирке не смеётся

Как сделать регистрозависимые замены в строке?

<input class="input" type="text" placeholder="enter regExp here">
<p class="resultParagraph">"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."</p>

let input = document.querySelector('.input');
let p = document.querySelector('.resultParagraph');
let startParagraph = p.innerHTML;

setInterval(()=>{ // просто функция чтобы параграф возвращался к стартовому значению
	if(!input.value)
		p.innerHTML = startParagraph;
}, 1000);


input.addEventListener('keypress', (e)=>{
	if(e.keyCode === 13){
		let res = new RegExp(input.value, 'gmi');
		let m = p.innerHTML.match(res);
     	p.innerHTML = p.innerHTML.replace(res, '<span style="background: red;">'+m[0]+'</span>'); // ! ! !
	}
});

Мне нужно, чтобы при вводе в поле input регулярного выражения, оно находилось в тексте и окрашивалось в (ну к примеру) в красный цвет. Всё бы хорошо, но интересует реализация данной задачи без m[0] , т.к. к примеру если регулярка учитывает наличие флага i(а она у меня учитывает) то получается что я заменяю вот этим вот m[0] даже те найденные в тексте совпадения, которые к примеру начинались с заглавной буквы, что разумеется мне не нужно, мне лишь нужно чтобы найденные совпадения подкрашивались, при этом не изменяя регистр. Просьба предложить вариант реализации, при котором если к примеру я введу в инпут at в тексте не заменятся все подстроки 'at' на 'At' т.к. m[0] в данном случае равняется At.
  • Вопрос задан
  • 110 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Метод replace умеет принимать функцию, которая получает найденную подстроку и должна вернуть замену:

m => `<span style="background: red;">${m}</span>`

Или, можно в строке замены указать, куда следует подставить заменяемую подстроку:

'<span style="background: red;">$&</span>'

Ерунду с интервалом уберите. Замену производите у текстового содержимого вместо разметки. Т.е.:

const p = document.querySelector('.resultParagraph');

document.querySelector('.input').addEventListener('keypress', e => {
  if (e.key === 'Enter') {
    const regex = RegExp(e.target.value, 'gmi');
    const replacement = '<span style="background: red;">$&</span>';
    p.innerHTML = p.textContent.replace(regex, replacement);
  }
});
Ответ написан
twobomb
@twobomb
Ух чето как-то костыльно, особенно setInterval
сделай хотя бы типа
let input = document.querySelector('.input');
let p = document.querySelector('.resultParagraph');

input.addEventListener("input",(e)=>{	
	if(e.target.value.trim() == "")
  	Array.from(p.children).forEach(el=>{
    	p.replaceChild(document.createTextNode(el.textContent),el);
    });  
});
input.addEventListener("change",(e)=>{	
     	p.innerHTML = p.innerHTML.replace(new RegExp(input.value, 'gmi'), (a)=>
       `<span style="background: red;">${a}</span>`
      );
});

или только на ввод
let input = document.querySelector('.input');
let p = document.querySelector('.resultParagraph');

input.addEventListener("input",(e)=>{	
  	Array.from(p.children).forEach(el=>{
    	p.replaceChild(document.createTextNode(el.textContent),el);
    });  
     	p.innerHTML = p.innerHTML.replace(new RegExp(input.value, 'gmi'), (a)=>
       `<span style="background: red;">${a}</span>`
      );
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы