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


94

Есть ли способ заменить обычный текст в элементе таблицы, помещенном в тело HTML?

Как заменить «привет» на «привет»?

Пожалуйста, используйте только JavaScript без jQuery .


Не могли бы вы быть более конкретными? Что вы хотите заменить, где это в теле и т. Д.
— Zirak 05

в теле есть div и внутри него таблица, тогда я хотел бы заменить какой-нибудь нормальный текст, а не код, например, заменить ("привет") на ("привет")
— Wahtever 05

3
большинство приведенных ниже решений уничтожат все события и всю структуру dom, если заменяемым словом окажется имя класса, имя тега или что-то еще в html
— Мухаммад Умер

Похоже, что и вопрос, и ответы неверны. Он спрашивает, как заменить слова, а не символы. Такая как замена этого hello, this is a text randomTexthelloдолжна быть hi, this is a text randomTexthello. Однако все остальные ответы здесь заменяют символы вместо слов.
— Орхун Альп Орал

Ответы:


139

Чтобы заменить строку в вашем HTML на другую, используйте метод replace на innerHTML :

document.body.innerHTML = document.body.innerHTML.replace('hello', 'hi');

Обратите внимание, что это заменит первый экземпляр helloво всем теле, включая любые экземпляры в вашем HTML-коде (например, имена классов и т. Д.), Поэтому используйте с осторожностью - для получения лучших результатов попробуйте ограничить объем вашей замены, нацелив свой код с помощью document.getElementById или аналогичный.

Чтобы заменить все экземпляры целевой строки, используйте простое регулярное выражение с gфлагом lobal:

document.body.innerHTML = document.body.innerHTML.replace(/hello/g, 'hi');

1
у меня не сработало вот что я использовал <script type="text/javascript"> window.onload = clear(); function clear() { document.body.innerHTML = document.body.replace('ü', 'n'); } </script>
— Wahtever

С расширенными символами может быть сложнее - в какой кодировке ваш документ? Вы уверены, что это символ ü, а не & # 252; например..?
— Декстер

2
вы не скопировали мой код точно ;-) убедитесь, что у вас есть innerHTML с обеих сторон оператора, то есть: document.body.innerHTML = document.body.innerHTML.replace ('ü', 'n');
— Декстер

3
К вашему сведению - ошибка в первом комментарии: задается window.onload = clear;без скобок «()». Когда вы пишете, clear()вы фактически выполняете функцию, но вы хотите назначить функцию только обработчику onload
— Филипп

1
Обратите внимание, что использование innerHTML в наши дни считается плохим: slideshare.net/x00mario/the-innerhtml-apocalypse
— kufudo

13

Приведенная ниже функция отлично работает для меня:

// Note this *is* JQuery, see below for JS solution instead
function replaceText(selector, text, newText, flags) {
  var matcher = new RegExp(text, flags);
  $(selector).each(function () {
    var $this = $(this);
    if (!$this.children().length)
       $this.text($this.text().replace(matcher, newText));
  });
}

Вот пример использования:

function replaceAllText() {
  replaceText('*', 'hello', 'hi', 'g');
}

$(document).ready(replaceAllText);
$('html').ajaxStop(replaceAllText);

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

document.body.innerHTML = document.body.innerHTML.replace('hello', 'hi');

Но будьте осторожны, так как это также может повлиять на теги, CSS и скрипты.

РЕДАКТИРОВАТЬ: Что касается чистого решения JavaScript, используйте вместо этого этот метод:

function replaceText(selector, text, newText, flags) {
  var matcher = new RegExp(text, flags);
  var elems = document.querySelectorAll(selector), i;

  for (i = 0; i < elems.length; i++)
    if (!elems[i].childNodes.length)
      elems[i].innerHTML = elems[i].innerHTML.replace(matcher, newText);
}

Как можно заменить весь текст в определенном теге (например, <p> или <span>) другим текстом?
— GJZ 05

Просто добавьте имя (а) тега к первому входному параметру, например replaceText ('p, span', 'hello', 'hi')
— Ziad

Это не работает правильно. Подумайте об этом: <p> здравствуйте, <strong> мир</ sizes </p>. привет не заменяется.
— Дэвид Вильхубер

Привет, я новичок в кодировании. Я могу сделать что-то хорошее с AppleScript. Но это все, что я знаю. Не могли бы вы дать мне несколько советов, с чего начать? Моя цель - использовать javascript для автоматизации сбора баз данных, изображений, видео, заполнения веб-форм, загрузки, возможно, для работы с Excel. В Applescript все в порядке, но Java кажется совершенно новым уровнем и намного лучше. С чего начать, чтобы достичь своих целей. Я знаю 0 о javascript, и я даже не знаю, как заставить ваш скрипт работать! Куда мне его приклеить? Большое спасибо!
— Duy Duy,

12

В итоге я воспользовался этой функцией для безопасной замены текста без побочных эффектов (пока что):

function replaceInText(element, pattern, replacement) {
    for (let node of element.childNodes) {
        switch (node.nodeType) {
            case Node.ELEMENT_NODE:
                replaceInText(node, pattern, replacement);
                break;
            case Node.TEXT_NODE:
                node.textContent = node.textContent.replace(pattern, replacement);
                break;
            case Node.DOCUMENT_NODE:
                replaceInText(node, pattern, replacement);
        }
    }
}

Это для случаев, когда 16 КБ findAndReplaceDOMTextслишком тяжелы.


Привет, я новичок в кодировании. Я могу сделать что-то хорошее с AppleScript. Но это все, что я знаю. Не могли бы вы дать мне несколько советов, с чего начать? Моя цель - использовать javascript для автоматизации сбора баз данных, изображений, видео, заполнения веб-форм, загрузки, возможно, для работы с Excel. В Applescript все в порядке, но Java кажется совершенно новым уровнем и намного лучше. С чего начать, чтобы достичь своих целей. Я знаю 0 о javascript, и я даже не знаю, как заставить ваш скрипт работать! Куда мне его приклеить? Большое спасибо!
— Duy Duy,

Дуй Дай, это много проблем. Само по себе описание задачи является достаточной причиной, чтобы бросить работу.
— фанк-будущее

9

У меня такая же проблема. Я написал свою собственную функцию, используя замену на innerHTML, но она испортила якорные ссылки и тому подобное.

Для правильной работы я использовал библиотеку .

В библиотеке есть отличный API. После включения скрипта я назвал его так:

findAndReplaceDOMText(document.body, {
  find: 'texttofind',
  replace: 'texttoreplace'
  }
);

Это было единственное решение, которое помогло решить мою проблему. Мне нужно было использовать REGEX для поиска и замены номеров телефонов на всем сайте, и другие ответы здесь нарушили бы мои события DOM.
— DavyH

3

Я пытался заменить действительно большую строку, и по какой-то причине регулярные выражения выдавали некоторые ошибки / исключения.

Итак, я нашел эту альтернативу регулярным выражениям, которая также работает довольно быстро. По крайней мере, для меня это было достаточно быстро:

var search = "search string";
var replacement = "replacement string";

document.body.innerHTML = document.body.innerHTML.split(search).join(replacement)

src: Как заменить все вхождения строки в JavaScript?


2

Используйте функцию замены строки javascript по умолчанию

var curInnerHTML = document.body.innerHTML;
curInnerHTML = curInnerHTML.replace("hello", "hi");
document.body.innerHTML = curInnerHTML;

1

Попробуйте применить предложенное выше решение к довольно большому документу, заменив довольно короткие строки, которые могут присутствовать в innerHTML или даже innerText, и ваш html-дизайн в лучшем случае сломается.

Поэтому я сначала беру только элементы текстового узла через узлы HTML DOM, например

function textNodesUnder(node){
  var all = [];
  for (node=node.firstChild;node;node=node.nextSibling){
    if (node.nodeType==3) all.push(node);
    else all = all.concat(textNodesUnder(node));
  }
  return all;
}

textNodes=textNodesUnder(document.body)
for (i in textNodes) { textNodes[i].nodeValue = textNodes[i].nodeValue.replace(/hello/g, 'hi');    

`и затем я применил замену на всех из них в цикле


1

Хотел добавить пример к ответу funky-future, поскольку я продолжал получать эту ошибку:

Uncaught TypeError: element.childNodes is not iterable

использовать так:

replaceInText(document.body,"search term","replacement");

у меня это не сработало с селекторами jQuery.


1
Если у вас есть новый вопрос, задайте его, нажав кнопку « Задать вопрос» . Включите ссылку на этот вопрос, если она помогает понять контекст. - Из
— отзыва

1
Это не новый вопрос, я расширял ответ на фанки-будущее, приводя пример, который работает. пришлось опубликовать новый ответ, так как мне не хватает репутации, чтобы прокомментировать его.
— Y Stroli

1

Иногда при изменении document.body.innerHTMLнекоторые JS скрипты ломаются на странице. Вот версия, которая меняет только содержимое textэлементов:

function replace(element, from, to) {
    if (element.childNodes.length) {
        element.childNodes.forEach(child => replace(child, from, to));
    } else {
        const cont = element.textContent;
        if (cont) element.textContent = cont.replace(from, to);
    }
};

replace(document.body, new RegExp("hello", "g"), "hi");

1

Хотя использование innerHTML.replace будет работать и довольно быстро, это нарушит состояние DOM. Вы можете воспроизвести это, установив «автофокус» в поле ввода, а затем изменив innerHTML в теле, он потеряет фокус.

Менее деструктивный подход:

// retrives all childNodes of body
var childNodes = document.body.childNodes;

// start replacing
replaceInNodes(childNodes,"search","replace");

function replaceInNodes(nodes,search,replace){
    // iterate through all nodes
    for (var i = 0; i < nodes.length; i++) { 
            var curNode = nodes[i];
            // if the node has attributes, let us look at those
            // i.E. we want to change "John" in the input placeholder to "Peter" - <input type="text" value="John">
            if(curNode.attributes !== undefined){
                var curNodeAttributes = curNode.attributes;
                for (var ii = 0; ii < curNodeAttributes.length; ii++) {
                    // replace attribute values
                    curNodeAttributes[ii].nodeValue = curNodeAttributes[ii].nodeValue.replace(search, replace);
                }   
            }
            // It is a "TEXT_NODE"
            // i.E. <span>John</span>
            if(curNode.nodeType == 3){
                curNode.data = this.injectIntoString(curNode.data);
            }
            // It is a "ELEMENT_NODE", meaning we need to go deeper
            if(curNode.nodeType == 1){
                this.replaceInNodes(curNode.childNodes);
            }
        }
}

Более подробную информацию можно найти здесь: https://zgheb.com/i?v=blog&pl=71#12.11.2020_-_Unobstrusively_replace_text_with_JavaScript Примечание: я являюсь автором указанной ссылки


0

Я новичок Javascriptи только начал изучать эти навыки. Пожалуйста, проверьте, подходит ли приведенный ниже метод для замены текста.

<script>

    var txt=document.getElementById("demo").innerHTML;
    var pos = txt.replace(/Hello/g, "hi")
    document.getElementById("demo").innerHTML = pos;

</script>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.