Замена слов текстовой области

#javascript #regex #replace #words

#javascript #регулярное выражение #заменить #слова

Вопрос:

Я создал функцию javascript для замены некоторых слов другими словами в текстовой области, но она не работает. Я сделал это:

 function wordCheck() {
    var text = document.getElementById("eC").value;
    var newText = text.replace(/hello/g, '<b>hello</b>');
    document.getElementById("eC").innerText = newText;
}
  

Когда я предупреждаю переменную newText, консоль сообщает, что переменная не существует.
Кто-нибудь может мне помочь?

Редактировать:
теперь он заменяет слова, но заменяет их на <b>привет</b> , но я хочу, чтобы это было выделено жирным шрифтом. Есть ли решение?

Комментарии:

1. Обратите внимание, что это заменит только первое hello слово в текстовой области. Если вы хотите заменить все, вам нужно использовать регулярное выражение с /g модификатором.

Ответ №1:

Обновить:
В ответ на вашу правку о том, что вы хотите, чтобы слово «привет» было выделено жирным шрифтом. Короткий ответ на это: это невозможно сделать. По крайней мере, не в простой текстовой области. Вероятно, вы ищете что-то более похожее на онлайн-редактор WYSIWYG или, по крайней мере, RTE (текстовый редактор Richt). Есть несколько из них, например, TinyMCE, который является приличным редактором WYSIWYG. Список редакторов RTE и HTML можно найти здесь.

Во-первых: как уже указывали другие: содержимое элемента textarea доступно через его value свойство, а не innerText . Вы получаете содержимое в порядке, но пытаетесь обновить его с помощью неправильного свойства: использовать value в обоих случаях.

Если вы хотите заменить все вхождения строки / слова / подстроки, вам придется прибегнуть к использованию регулярного выражения с использованием g модификатора. Я бы также рекомендовал сделать соответствие без учета регистра, чтобы заменить «привет», «Привет» и «ПРИВЕТ» одинаково:

 var txtArea = document.querySelector('#eC');
txtArea.value = txtArea.value.replace(/(hello)/gi, '<b>$1</b>');
  

Как вы можете видеть: я зафиксировал совпадение и использовал его в строке замены, чтобы сохранить заглавные буквы, которые мог использовать пользователь.

Но подождите, это еще не все:

Что, если по какой-то причине входные данные уже содержат <b>Hello</b> или содержат слово, содержащее строку «привет», например «Компания называется hellonearth?»Введите условные соответствия (также известные как утверждения поиска) и границы слов:

 txtArea.value = txtArea.value.replace(x.value.replace(/(?!>)b(hello)b(?!<)/gi, '<b>$1</b>');
  

скрипка

Как это работает:

  • (?!>) : Сопоставляйте остальные только в том случае, если им не предшествует > символ (будьте более конкретными, если хотите, и используйте (?!<b>) . Это называется отрицательным прогнозом
  • b : граница слова, чтобы убедиться, что мы не совпадаем с частью слова
  • (hello) : сопоставление и захват строкового литерала при условии (как объяснено выше), что ему не предшествует a > и есть граница слова
  • (?!<) : то же, что и выше, только теперь мы не хотим находить соответствие </b> , поэтому вы можете заменить это на более конкретное (?!</b>)
  • /gi : модификаторы или флаги, которые влияют на весь шаблон: g для глобального (это означает, что этот шаблон будет применен ко всей строке, а не только к одному совпадению). Механизм i регулярных выражений сообщает, что шаблон чувствителен к регистру i , т. Е. h Соответствует как верхнему, так и нижнему регистру.

Строка замены <b>$1</b> : когда строка замены содержит $n подстроки, где n — число, они обрабатываются как обратные ссылки. Регулярное выражение может группировать совпадения в различные части, каждая группа имеет номер, начинающийся с 1, в зависимости от того, сколько у вас групп. Мы группируем только одну часть шаблона, но предположим, что мы написали:

 'foobar hello foobar'.replace(/(hel)(lo)/g, '<b>$1-$2</b>');
  

Результат будет таким "foobar <b>hel-lo</b> foobar" , потому что мы разделили совпадение на 2 части и добавили тире в строку замены.
Я думаю, что я оставлю введение RegExp на этом … хотя мы только поцарапали поверхность, я думаю, теперь совершенно ясно, насколько мощными могут быть регулярные выражения. Потратьте некоторое время и усилия на то, чтобы узнать больше об этом фантастическом инструменте, оно того стоит.

Ответ №2:

Если <textarea> , то вам нужно использовать .value свойство.

 document.getElementById("eC").value = newText;
  

И, как упоминал Бармар, replace() заменяет только первое слово. Чтобы заменить все слова, вам нужно использовать простое регулярное выражение. Обратите внимание, что я удалил кавычки. /g означает глобальную замену.

 var newText = text.replace(/hello/g, '<b>hello</b>');
  


Но если вы хотите действительно выделить текст жирным шрифтом, вам нужно использовать редактируемый div, а не текстовую область:

 <div id="eC" contenteditable></div>
  

Итак, вам нужно получить доступ innerHTML :

 function wordCheck() {
    var text = document.getElementById("eC").innerHTML;
    var newText = text.replace(/hello/g, '<b>hello</b>');
    newText = newText.replace(/amp;<bamp;>amp;<bamp;>/g,"amp;<bamp;>");//These two lines are there to prevent <b><b>hello</b></b>
    newText = newText.replace(/amp;</bamp;>amp;</bamp;>/g,"amp;</bamp;>");
    document.getElementById("eC").innerHTML = newText;
}
  

Комментарии:

1. Спасибо, это работает! Но я хочу сделать текст жирным шрифтом, но теперь он отображает <b>привет</b> не жирным шрифтом.

2. @user3722860: я обновил свой ответ… простой ответ заключается в том, что это невозможно сделать с помощью простого текстового поля. По крайней мере, нелегко. Уже доступно довольно много открытых, бесплатных и проверенных редакторов. Я добавил несколько ссылок к своему ответу. Проверьте их, чтобы найти то, что наилучшим образом соответствует вашим потребностям

3. Отредактировано @user3722860. Работает?

4. @nicael: Да, я это сделал, но зачем беспокоиться о разработке еще одного базового RTE, когда есть гораздо более доступные инструменты. CKEditor можно настроить так, чтобы он делал именно то, что хочет OP, без необходимости разрабатывать все целиком. Не будьте глупыми, если вы можете быть ленивыми, вот почему я настоятельно рекомендую использовать код, который уже существует

5. Я должен использовать текстовую область, потому что мне нужно ввести в нее текст, а затем изменить цвет или изменить его на жирный, возможно ли это?