Remplacer les mots dans le corps du texte

94

Existe-t-il un moyen de remplacer le texte normal dans un élément de tableau placé dans le corps du HTML?

Comme remplacer "bonjour" par "salut"?

Veuillez n'utiliser que JavaScript sans jQuery .

Wahtever
la source
Pouvez-vous s'il vous plaît être plus précis? Que voulez-vous remplacer, où est-il dans le corps, etc.
Zirak
le corps a un div et à l'intérieur d'une table, alors je voudrais remplacer du texte normal et non du code comme le remplacement ("bonjour") par ("salut")
Wahtever
3
la plupart des solutions ci-dessous détruiront tous les événements et toute la structure du dom si le mot remplacé était un nom de classe, un nom de tag ou quoi que ce soit en html
Muhammad Umer
Il semble que la question et les réponses soient fausses. Il demande comment remplacer des mots et non des caractères. Tels que le remplacement de ce hello, this is a text randomTexthellodevrait être hi, this is a text randomTexthello. Cependant, toutes les autres réponses remplacent ici les caractères au lieu des mots.
Orhun Alp Oral

Réponses:

139

Pour remplacer une chaîne dans votre HTML par une autre, utilisez la méthode replace sur innerHTML :

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

Notez que cela remplacera la première instance de hellodans tout le corps, y compris toutes les instances de votre code HTML (par exemple les noms de classe, etc.), donc utilisez avec prudence - pour de meilleurs résultats, essayez de restreindre la portée de votre remplacement en ciblant votre code en utilisant document.getElementById ou similaire.

Pour remplacer toutes les instances de la chaîne cible, utilisez une expression régulière simple avec l' gindicateur lobal:

document.body.innerHTML = document.body.innerHTML.replace(/hello/g, 'hi');
Dexter
la source
1
n'a pas fonctionné pour moi voici ce que j'ai utilisé <script type="text/javascript"> window.onload = clear(); function clear() { document.body.innerHTML = document.body.replace('ü', 'n'); } </script>
Wahtever
Cela peut être plus compliqué avec des caractères étendus - dans quel encodage votre document est-il? Êtes-vous sûr que le caractère est un ü, et non & # 252; par exemple..?
Dexter
2
vous n'avez pas copié mon code avec précision ;-) assurez-vous que vous avez innerHTML des deux côtés de l'instruction, c'est-à-dire: document.body.innerHTML = document.body.innerHTML.replace ('ü', 'n');
Dexter
3
FYI - Le bogue dans le premier commentaire est: défini window.onload = clear;sans les parenthèses "()". Lorsque vous écrivez, clear()vous exécutez réellement la fonction, mais vous ne voulez affecter la fonction qu'au gestionnaire onload
Philipp
1
Notez que l'utilisation de innerHTML est généralement considérée comme mauvaise de nos jours: slideshare.net/x00mario/the-innerhtml-apocalypse
kufudo
13

La fonction ci-dessous fonctionne parfaitement pour moi:

// 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));
  });
}

Voici un exemple d'utilisation:

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

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

Vous pouvez également utiliser faire un remplacement direct comme ceci:

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

Mais soyez prudent car cela peut également affecter les balises, le CSS et les scripts.

EDIT: Comme pour une solution JavaScript pure, utilisez plutôt cette méthode:

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);
}
Ziad
la source
Comment procéder pour remplacer tout le texte d'une balise spécifique (comme <p> ou <span>) par un autre texte?
GJZ
Ajoutez simplement le (s) nom (s) de balise au premier paramètre d'entrée, par exemple replaceText ('p, span', 'hello', 'hi')
Ziad
Cela ne fonctionne pas correctement. Considérez ceci: <p> bonjour <strong> monde</ensus </p>. bonjour ne se remplace pas.
David Vielhuber
Salut, je suis débutant en codage. Je peux faire du bien avec AppleScript. Mais c'est tout ce que je sais. Pouvez-vous s'il vous plaît me donner quelques conseils, par quoi commencer, mon but est d'utiliser javascript pour automatiser la collecte de bases de données, d'images, de vidéos, de remplir des formulaires Web, de télécharger, peut-être de travailler avec Excel. Applescript est d'accord, mais java semble être un tout nouveau niveau et bien plus encore. Par quoi dois-je commencer pour atteindre mes objectifs. Je connais 0 sur javascript et je ne sais même pas comment faire fonctionner votre script ci-dessus! Où dois-je le coller? Merci beaucoup!
Duy Duy le
11

J'ai fini avec cette fonction pour remplacer en toute sécurité le texte sans effets secondaires (jusqu'à présent):

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);
        }
    }
}

C'est pour les cas où les 16 Ko de findAndReplaceDOMTextsont un peu trop lourds.

futur funky
la source
Salut, je suis débutant en codage. Je peux faire du bien avec AppleScript. Mais c'est tout ce que je sais. Pouvez-vous s'il vous plaît me donner quelques conseils, par quoi commencer, mon but est d'utiliser javascript pour automatiser la collecte de bases de données, d'images, de vidéos, de remplir des formulaires Web, de télécharger, peut-être de travailler avec Excel. Applescript est d'accord, mais java semble être un tout nouveau niveau et bien plus encore. Par quoi dois-je commencer pour atteindre mes objectifs. Je connais 0 sur javascript et je ne sais même pas comment faire fonctionner votre script ci-dessus! Où dois-je le coller? Merci beaucoup!
Duy Duy le
Duy Duy, c'est beaucoup de problèmes. Compte tenu de la description de la tâche seule, c'est une raison suffisante pour quitter le poste.
funky-future
9

J'ai eu le même problème. J'ai écrit ma propre fonction en utilisant replace sur innerHTML, mais cela ferait bousiller les liens d'ancrage et autres.

Pour que cela fonctionne correctement, j'ai utilisé une bibliothèque pour le faire.

La bibliothèque a une API géniale. Après avoir inclus le script, je l'ai appelé comme ceci:

findAndReplaceDOMText(document.body, {
  find: 'texttofind',
  replace: 'texttoreplace'
  }
);
David Silva Smith
la source
C'était la seule solution qui fonctionnait pour mon problème. J'avais besoin d'utiliser REGEX pour trouver et remplacer des numéros de téléphone sur tout un site et d'autres réponses ici briseraient mes événements DOM.
DavyH le
3

J'essayais de remplacer une très grande chaîne et pour une raison quelconque, les expressions régulières lançaient des erreurs / exceptions.

J'ai donc trouvé cette alternative aux expressions régulières qui fonctionne également assez rapidement. Au moins, c'était assez rapide pour moi:

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

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

src: Comment remplacer toutes les occurrences d'une chaîne en JavaScript?

Bartho Bernsmann
la source
2

Utilisez la fonction de remplacement de chaîne javascript par défaut

var curInnerHTML = document.body.innerHTML;
curInnerHTML = curInnerHTML.replace("hello", "hi");
document.body.innerHTML = curInnerHTML;
Mark Costello
la source
1

Essayez d'appliquer la solution suggérée ci-dessus sur un document assez volumineux, en remplaçant les chaînes assez courtes qui pourraient être présentes dans innerHTML ou même innerText, et votre conception html devient au mieux cassée

Par conséquent, je prends d'abord uniquement les éléments de nœud de texte via des nœuds HTML DOM, comme ceci

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');    

`et ensuite j'ai appliqué le remplacement sur chacun d'eux en cycle

FantomX1
la source
1

Je voulais ajouter un exemple à la réponse de funky-future car je continuais à recevoir cette erreur:

Uncaught TypeError: element.childNodes is not iterable

utiliser comme ceci:

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

cela n'a pas fonctionné pour moi avec les sélecteurs jQuery.

Y Stroli
la source
1
Si vous avez une nouvelle question, posez-la en cliquant sur le bouton Poser une question . Incluez un lien vers cette question si cela permet de fournir un contexte. - De l'avis
SilverNak
1
Ce n'est pas une question nouvelle, je développais la réponse de funky-future en donnant un exemple qui fonctionne. a dû poster une nouvelle réponse car je n'ai pas de représentant pour commenter la sienne.
Y Stroli
1

Parfois, le changement document.body.innerHTMLinterrompt certains scripts JS sur la page. Voici la version, qui ne change que le contenu des textéléments:

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");
Oleksandr Boiko
la source
0

Je suis nouveau Javascriptet je viens de commencer à apprendre ces compétences. Veuillez vérifier si la méthode ci-dessous est utile pour remplacer le texte.

<script>

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

</script>
Manish
la source