[JS] replace nur auf html-content [ERLEDIGT]

Greggy

Kies-Media.de
ID: 279865
L
27 Juli 2007
578
38
hi,

ich lese eine webseite mittels
text=document.body.innerHTML;
ein.
jetzt möchte ich, dass immer wenn auf der seite ein suchwort erscheint, dieses durch ein ersetzungswort ersetzt wird ..... allerdings so, das die ersetzungen nur im content gemacht werden, also z.b.
HTML:
<a href="irgendwas">Suchwort</a>
soll NICHT ersetzt werden, weil das suchwort als link-text drin ist
oder
HTML:
<div id="suchwort">
....soll auch NICHT ersetzt werden, weil suchwort zum "html-funktionscode" gehört
==> also wirklich nur der sichtbare content soll geändert werden....wie geht das?

Vielen Dank schonmal im vorraus

P.s. eventuell geht das auch ganz anders....ich bin für alle vorschläge dankbar
 
Zuletzt bearbeitet:
ich weiß zwar nicht wie komplex dein script ist, aber eine super Hilfe allgemein in solchen Dingen ist www.jquery.com.

Da kannst du Suchmuster über deinen Quelltext jagen und unkompliziert ersetzen!
 
ich weiß zwar nicht wie komplex dein script ist, aber eine super Hilfe allgemein in solchen Dingen ist www.jquery.com.

Da kannst du Suchmuster über deinen Quelltext jagen und unkompliziert ersetzen!

erstmal danke für die antwort

du beziehst dich bestimmt auf diese funktion, aber auch die kontrolliert nicht, ob der text nur im content ist....
hintergrund ist, dass der selbe code auf 1000 verschiedenen webseiten (mit 1000 verschiedenen strukturen) eingebaut werden soll und ich deshalb kein genaues suchmuster angeben kann.
Ziel ist es beispielsweise überall wo im content das wort: "böses wort" steht, dieses durch "gutes wort" zu ersetzten

Mfg Greggy
 
hmm, du müsstest den DOM-Baum durchwandern, alle bösen Inhalte mit RegExp replacen, nur den Sinn versteh eich nicht.

ich will doch aber den selben javascriptcode auf 1000 verschiedenen seiten einsetzen (mit 1000 verschiedenen DOM-Strukturen)....der sinn liegt doch auf der hand: stell dir vor du willst einen service für webseiten anbieten, und sagst: wenn du meinen java-script-code auf deiner seite einsetzt gearantiere ich dir, wird es auf deiner seite z.b. keine Nazi-wörter geben (z.b. für foren)....ich will jetzt keine diskussion, ob die meisten foren soetwas schon haben!!!....es geht um die funktion selber

Hab ich das ausreichend erklärt, wass die funktion machen soll?

ich will quasi eine funktion replace2(original_Html_code,zu_ersetzendes_wort,ersetzes_wort)
{

return korigierten_html_code;
}

wo ich den html-code einer seite reingebe, dann ein böses wort, ein gutes wort, und als ausgabe ist der html code verbessert worden. Dabei soll aber die struktur, das design, die funktionalität usw. der Html-seite erhalten bleiben!....also darf die ersetztung nur auf dem lesbaren text erfolgen und z.b. auch nicht das böse_wort in einem ggf. enhaltenen <script>function böses_wort(){....}</script> ersetzt werden, weil dadurch ja die funktion nicht mehr aufrufbar wäre

bitte helft mir...

Mfg Greggy
 
öhm, du weisst aber schon das du den Baum durchlaufen kannst, ohne deren Struktur zu kennen?
Also einfach rekursiv alles durchlaufen und fertig
 
theoretisch schon....ich bin halt leider nicht so der JS-experte

ich dachte das das eventuell ne fertige funktion dafür gibt?!?

falls nicht, kannst du grob mal zeigen, wie sowas aussieht?

Mfg Greggy
 
ich will doch aber den selben javascriptcode auf 1000 verschiedenen seiten einsetzen (mit 1000 verschiedenen DOM-Strukturen).

Mfg Greggy


Wie bereits gesagt: Das ist mit jquery möglich.

Du kannst den ersten Knoten auswählen und dann den Inhalt des Container auslesen auf dein Wort durchsuchen ggf. ersetzen und dann gehst du zumnächsten. Wenn ein Link kommen sollte, kannst du diesen ignorieren.

Dazu musst du die Struktur nicht kennen!

Hab im moment wenig Zeit, sonst hätte ich dir gern nen Beispiel gegeben. Liefere ich aber gerne noch nach.
 
Ich habe grade mal ein bisschen rumprobiert, weil mich die Fragestellung interessiert hat und folgendes ist dabei rausgekommen. Vielleicht hilft's Dir ja weiter... ;)

HTML:
<html>
<head>
	<title>Foo</title>
<script type="text/javascript">
//<![CDATA[
Array.prototype.contains = function(needle) {
	for (var i = 0, found=false; i < this.length; i++) {
		if (this[i] == needle) {
			found = true;
			break;
		}
	}
	return found;
}

var bad_words = {
	'böses': 'gutes',
	'nicht gut' : 'super'
}
var no_replace = ['a', 'img', 'iframe'];

function searchTree(tree) {
	var branch = tree.firstChild;
	do {
		if (no_replace.contains(branch.nodeName.toLowerCase())) {
			continue;
		} else if (branch.hasChildNodes() && !(branch.childNodes.length==1 && branch.firstChild.nodeType==3)) {
			searchTree(branch);
		} else if (branch.nodeType!=3) {
			for (var bad_word in bad_words)
			{
				eval("var reg_exp = /"+bad_word+"/i;");
				while (branch.innerHTML.search(reg_exp)>-1) {
					branch.innerHTML = branch.innerHTML.replace(reg_exp, bad_words[bad_word]);
				}
			}
		}
	} while (branch = branch.nextSibling);
}

window.onload = function() {
	searchTree(document.getElementsByTagName('body')[0]);
}
//]]>
</script>
</head>
<body>
	<h1>Test für böses Wort</h1>
	<p>
		<a href="link">Ich bin ein böses Wort und werde nicht ersetzt</a>
		<div>Hier ist noch ein böses Wort und das finde ich nicht gut.</div>
	</p>
	<p>
		Hier wird nix ersetzt, weil hier auch nix steht.
	</p>
</body>
</html>
In bad_words werden halt wie im Code zu setzen ist, die zu ersetzenden Wörter definiert. In no_replace werden die Tags eingetragen, innerhalb derer nicht ersetzt werden soll.
 
Wie kommt Ihr denn jetzt auf Prototype? Nur weil ich den Prototype des Arrays um die Funktion contains() erweitert habe? Das sind 2 völlig verschiedene Paar Schuhe. Das Framework Prototype hat zwar den Namen aufgrund dieser Möglichkeit, dies zu tun, aber man darf es ruhig ohne das Framework derart einsetzen. ;)

Der Code ist so wie er da steht funktionstüchtig.
 
Ich habe grade mal ein bisschen rumprobiert, weil mich die Fragestellung interessiert hat und folgendes ist dabei rausgekommen. Vielleicht hilft's Dir ja weiter... ;)

HTML:
<html>
<head>
	<title>Foo</title>
<script type="text/javascript">
//<![CDATA[
Array.prototype.contains = function(needle) {
	for (var i = 0, found=false; i < this.length; i++) {
		if (this[i] == needle) {
			found = true;
			break;
		}
	}
	return found;
}

var bad_words = {
	'böses': 'gutes',
	'nicht gut' : 'super'
}
var no_replace = ['a', 'img', 'iframe'];

function searchTree(tree) {
	var branch = tree.firstChild;
	do {
		if (no_replace.contains(branch.nodeName.toLowerCase())) {
			continue;
		} else if (branch.hasChildNodes() && !(branch.childNodes.length==1 && branch.firstChild.nodeType==3)) {
			searchTree(branch);
		} else if (branch.nodeType!=3) {
			for (var bad_word in bad_words)
			{
				eval("var reg_exp = /"+bad_word+"/i;");
				while (branch.innerHTML.search(reg_exp)>-1) {
					branch.innerHTML = branch.innerHTML.replace(reg_exp, bad_words[bad_word]);
				}
			}
		}
	} while (branch = branch.nextSibling);
}

window.onload = function() {
	searchTree(document.getElementsByTagName('body')[0]);
}
//]]>
</script>
</head>
<body>
	<h1>Test für böses Wort</h1>
	<p>
		<a href="link">Ich bin ein böses Wort und werde nicht ersetzt</a>
		<div>Hier ist noch ein böses Wort und das finde ich nicht gut.</div>
	</p>
	<p>
		Hier wird nix ersetzt, weil hier auch nix steht.
	</p>
</body>
</html>
In bad_words werden halt wie im Code zu setzen ist, die zu ersetzenden Wörter definiert. In no_replace werden die Tags eingetragen, innerhalb derer nicht ersetzt werden soll.

danke!...das ist GENAU das was ich gesucht hatte!!!
natürlich auch an die anderen beteiligten!

Mfg Greggy