Trouver et remplacer des caractères de texte dans un document avec JS
Je me demandais si il y a une légère façon, je pouvais utiliser du JavaScript ou jQuery pour renifler un texte spécifique personnage à travers un document; dire € et de trouver toutes les occurrences de ce caractère. Et puis! Écrire une fonction permettant de remplacer toutes les occurrences de ce avec dit une $.
J'ai trouvé cet extrait de code pour commencer:
var str = 'test: '';
str = str.replace(/'/g, "'");
Essentiellement; je suis désireux d'une solution pour un document d'une page. Saisir toutes les instances de X et de le rendre XY. Seuls les caractères de texte.
- Oui, il y a probablement un moyen de le faire, bien que la façon la plus simple permettrait également de supprimer tous les gestionnaires d'événements et les éléments de données à partir de votre page.
$("body").html( $(body).html().replace(/\€/g,'$') )
c'est une mauvaise façon de faire. - Je vois. OK merci.
- Si vous voulait éviter de perdre des événements et de l'élément de données, il devient beaucoup plus complexe.
- Merci @KevinB, j'aime la chair davantage. Juste quelque chose que je suis curieux de savoir. Que pourrais-je ajouter, pour être plus précis?
- La meilleure chose serait de le faire côté serveur, mais si ce n'est pas une option, côté client, vous devez sélectionner tous les nœuds de texte dans le document, effectuer une itération sur eux, puis de réaliser les remplacer sur chaque nœud de texte individuellement.
- Voici un échantillon à l'aide d'un plugin, j'ai écrit un tout à l'arrière pour mettre du texte en surbrillance. jsfiddle.net/2t8TV/1 je l'ai utilisé pour envelopper toutes les occurrences de
€
avec une plage, puis j'ai remplacé le texte à l'intérieur de ces travées.
Vous devez vous connecter pour publier un commentaire.
Comment à ce sujet, en remplacement de
@
avec$
:http://jsfiddle.net/maximua/jp96C/1/
i
à la regex va vous donner une casse de recherche si vous êtes le remplacement de caractères alpha.replace(/soMeWord/gi,"Another Word"));
Ma propre suggestion est comme suit:
JS Fiddle démo.
La
nativeSelector()
fonction provient de une réponse (posté par Anurag) à cette question: getElementsByTagName() équivalent pour textNodes.ECMAScript 2015+ approche
Les pièges lors de la résolution de cette tâche
Cela semble comme une tâche facile, mais vous devez prendre soin de plusieurs choses:
<script>
ou<style>
contenu, ou des balises HTML ou des attributs, qui n'est pas toujours souhaitétitle
etalt
(de manière contrôlée) ainsiProtection contre xss les attaques ne peuvent pas être résolus en utilisant les méthodes ci-dessous. E. g. si un
fetch
appel lit une URL à partir de quelque part sur la page, puis envoie une requête à cet URL, les fonctions ci-dessous ne s'arrêtera pas que, depuis ce scénario est dangereuse en soi.De remplacer le contenu de texte de tous les éléments
En fait cela sélectionne tous les éléments qui contiennent du texte normal, qui leur passe par les nœuds enfants — parmi ceux-ci sont aussi des nœuds de texte —, cherche à celles des nœuds de texte et remplace leur contenu.
Vous pouvez éventuellement spécifier un autre racine
target
, par exemplereplaceOnDocument(/€/g, "$", { target: someElement });
; par défaut, le<body>
est choisi.Remplacer les nœuds de texte, les éléments, les attributs et les propriétés
Maintenant, c'est un peu plus complexe: il faut vérifier trois cas: si un nœud est un texte nœud, si c'est un élément et de son attribut doit être remplacé, ou si c'est un élément et de son propriété doit être remplacé. Un
replacer
objet fournit des méthodes pour les nœuds de texte et des éléments.Avant de remplacer des attributs et des propriétés, la poudre doit vérifier si l'élément possède un attribut correspondant; sinon, de nouveaux attributs créés, considérée comme indésirable. Il doit également vérifier si le ciblées propriété est une chaîne de caractères, puisque seules des chaînes de caractères peut être remplacé, ou si la mise en correspondance de la propriété de la cible de l'attribut n'est pas une fonction, car cela peut conduire à un xss attaque.
Dans l'exemple ci-dessous, vous pouvez voir comment utiliser les fonctionnalités étendues: dans le troisième argument optionnel, vous pouvez ajouter un
attrs
de la propriété et unprops
de la propriété, qui est un objet iterable (par exemple un tableau) chacune, pour les attributs pour être remplacé et les propriétés d'être remplacés, respectivement.Vous remarquerez également que cet extrait utilise
flatMap
. Si ce n'est pas pris en charge, utilisez un polyfill ou de la remplacer par l'reduce
–concat
, oumap
–reduce
–concat
construire, comme on le voit dans les liens de la documentation.Remplacement par des entités HTML
Si vous avez besoin pour le faire fonctionner avec des entités HTML comme
­
, les approches ci-dessus va littéralement produire de la chaîne­
, puisque c'est un HTML entité et ne fonctionne que lors de l'attribution.innerHTML
ou à l'aide de méthodes connexes.Donc, nous allons le résoudre en passant par la chaîne d'entrée à quelque chose qui accepte une chaîne HTML: un nouveau temporaire
HTMLDocument
. Il est créé par leDOMParser
’sparseFromString
méthode; à la fin, nous avons lu sondocumentElement
’stextContent
:Si vous souhaitez utiliser cette fonction, choisissez l'une des méthodes ci-dessus, en fonction de si oui ou non vous voulez remplacer le HTML attributs et des propriétés DOM, en plus du texte; il suffit ensuite de remplacer le commentaire
//Handle `string` — see the last section
par la ligne ci-dessus.Maintenant, vous pouvez utiliser
replaceOnDocument(/Güterzug/g, "Güter­zug");
.NB: Si vous n'utilisez pas la chaîne de la manipulation de code, vous pouvez également supprimer le
{
}
autour de la flèche corps de la fonction.Noter que cette analyse entités HTML, mais encore interdit l'insertion réelle des balises HTML, puisque nous sommes seulement en lecture le
textContent
. C'est également protégé contre la plupart des cas, de xss: puisque nous l'utilisonsparseFromString
et la page dedocument
n'est pas touché, pas de<script>
est téléchargé et pas deonerror
gestionnaire est exécuté.Vous devriez également envisager l'utilisation de
\xAD
au lieu de­
directement en JavaScript de votre chaîne, si elle s'avère à être plus simples.Lo­rem
etip­sum
(Latin exemples). Vous n'arrive pas à savoir comment le résoudre, vous?innerHTML
. Je suis en train de travailler sur un autre chemin, et fera Tripote les deux. Ainsi, nous pouvons voir lequel est le plus rapide et le plus facile à maintenir pour la prochaine web dev. Arnold dit: "je vais être de retour. 😉innerHTML
de remplacement qui a le problème de l'annulation écouteurs d'événement...innerHTML
sans détruire des descendants des écouteurs d'événement?. Fondamentalement,body.children[someChild].addEventListener(someEvent, someListener);
puisbody.innerHTML += someAdditionalContent;
oubody.innerHTML = someNewContent;
sérialise et re-traite la totalité de HTML, de compensation hors tout précédemment liés à l'écouteur d'événement. C'est pourquoi, dans mon approche, j'ai soigneusement remplacer le contenu de ses différents nœuds de texte.En javascript sans utiliser jquery:
g
commutateur/modificateur, qui ne fera que remplacer la première occurrence de la "actualword'.document.body.innerText = document.body.innerText.replace('actualword', 'replacementword')
...Pour chaque élément à l'intérieur du document
body
modifier leur texte à l'aide de .texte(fn) fonction.Le mieux serait de le faire côté serveur ou enveloppez-les symboles de devise à un élément, vous pouvez sélectionner avant de les renvoyer au navigateur, mais si ni est une option, vous pouvez sélectionner tous les nœuds de texte dans le corps et de faire le remplacer sur eux. Ci-dessous, je suis en train de faire cela à l'aide d'un plugin que j'ai écrit il y a 2 ans qui avait été préparée pour la mise en évidence de texte. Ce que je suis en train de faire est de trouver toutes les occurrences d'euros et en l'enveloppant dans un span avec la classe de la monnaie-symbole, alors je suis en remplaçant le texte de ces travées.
Démo
Utiliser split et join méthode
ici est solution
Similaire à @max-malik réponse, mais sans l'aide de jQuery, vous pouvez également le faire à l'aide de document.createTreeWalker:
JS:
HTML:
Le présent document remplace toutes les instances de
replacetext
avecactualtext
Vous pouvez utiliser:
replaceAll()
l'indique, il est utilisé pour remplacer un ensemble d'éléments avec un autre élément.Que vous serez à l'aide de jQuery, de toute façon, essayez:
https://github.com/cowboy/jquery-replacetext
Puis il suffit de faire
Il semble faire du bon travail de remplacement de texte et de ne pas jouer avec les autres éléments
Je pense que vous pouvez peut-être avoir à y penser cela.
Mon approche est simple.
Joignez-vous à la page avec une balise div:
Dans votre javascript: