Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Замена слова посредством Java-script (https://javascript.ru/forum/misc/2946-zamena-slova-posredstvom-java-script.html)

Assassin 02.03.2009 20:50

Замена слова посредством Java-script
 
Здравствуйте, ребята. Хотел бы обратиться к вам за помощью. Мне нужен скрипт, код которого нужно вставить в тело страницы, чтобы на этой странице происходила замена слова на другое (прописанные в скрипте). В Java не силён, потому прошу вас помочь. Заранее премного благодарен (:

Kolyaj 02.03.2009 21:39

Цитата:

Сообщение от Assassin
В Java не силён

Да вы и в описании задач не сильны.

Assassin 03.03.2009 10:20

Это объясняется моим незнанием Java-script. Попробую показать на пальцах.
Например у нас есть страница. Много, много букв, и где-то встречается слово 'пельмень'. Затем, в страницу вставляется скрипт. На той же странице, всё так же много, много букв, но вместо 'Пельменя' мы видим 'Укроп'. А замена слова непосредственно осуществляется скриптом, где указано, что на что менять. Вот этот скрипт я и ищу. Вы уж простите за нелепость, объяснил как смог. Кто-нибудь знает как осуществить замысел?

x-yuri 03.03.2009 12:35

может лучше что-то типа orphus ?
иначе объясни зачем менять пельмень на укроп? Какова цель?

Assassin 05.03.2009 09:49

Хм... Нет, мне не орфографию менять надо. Приведу ещё одну аналогию. На сайте замечана пассивная xss, хочу на страничке изменить слово. В моём распоряжении всего одна форма, куда можно подгрузить свой скрипт. Вот и ищу простенький скрипт замены слова.

AzriMan 05.03.2009 11:33

а вы думаете скрипт будет автоматически выполняться? я что-то всё равно не пойму какая конечная цель :)

Assassin 05.03.2009 13:52

Я надеюсь (:
Представим на секунду, что в поле отправки сообщения на данном форуме не фильтруется ничего. Я вставляю сюда скрипт, и после отправки, на странице вместо ника AzriMan будет, например, AndryMan.

Kolyaj 05.03.2009 13:59

Цитата:

Сообщение от Assassin
Я вставляю сюда скрипт, и после отправки, на странице вместо ника AzriMan будет, например, AndryMan.

document.body.innerHTML = document.body.innerHTML.replace('AzriMan', 'AndryMan');
Грубо конечно :)

x-yuri 05.03.2009 19:26

Assassin, т.е. цель - защита от XSS атак?

Gvozd 05.03.2009 19:47

x-yuri,
полагаю, что наоборот))))

Assassin 06.03.2009 15:56

Цитата:

Сообщение от Kolyaj (Сообщение 13718)
document.body.innerHTML = document.body.innerHTML.replace('AzriMan', 'AndryMan');
Грубо конечно :)

К сожалению, при вставке этого кода - ничего не произошло.

Цитата:

Сообщение от x-yuri
Assassin, т.е. цель - защита от XSS атак?

Нет

Цитата:

Сообщение от Gvozd
полагаю, что наоборот))))

Хм, я такого не говорил, я лишь приводил аналогии.

Assassin 08.03.2009 14:35

Ребят? Неужели никто не поможет? ):

x-yuri 08.03.2009 15:08

так ведь чтобы помочь нужно знать цель - "для чего это все?"

Gvozd 08.03.2009 15:20

не знаю почему у вас не работает этот код.
по крайней мере на простейших страницах он срабатывает.
вот, мой пример рабочей страницы
<html>
<head>
<script type="text/javascript">
window.onload=function(){
document.body.innerHTML = document.body.innerHTML.replace(/AzriMan/g, 'AndryMan');

}
</script>
</head>
<body>
qwe<br/>
azriMan<br/>
qwe<br/>
<table border="1">
	<tr>
		<td>AzriMan</td><td>AzriMa_n</td>
	</tr>
	<tr>
		<td>AzriM_an</td><td>AzriMa_n</td>
	</tr>
</table>
AzriMan<br/>
</body>
</html>

я заменил 'AzriMan' на /AzriMan/g для того, чтобы все вхождения заменялись.без этого тоже работает, но заменяет только первую строку.
с целью разъяснения этой функциипочитайте статью про регулярные выражения

вот еще одна вариация кода по замене, более сложная.
window.onload=function(){
all_elements=document.getElementsByTagName('*');
for(i=0,s=all_elements.length;i<s;i++)
	if(all_elements[i].tagName!="SCRIPT")
		for(j=0,s_=all_elements[i].childNodes.length;j<s_;j++)
			if(all_elements[i].childNodes[j].nodeType==3)
				all_elements[i].childNodes[j].textContent=all_elements[i].childNodes[j].textContent.replace(/AzriMan/g, 'AndryMan');
}

менее компактно.
возмжно более медлено.хотя не факт.
возможно быстрее даже на больших документах.
во всяком случае в этом коде не происходит перерисовки всего дерева, как в предыдущем коде.
в общем, потестите.
Код можно изменять и дополнять разными способами, от разных аспектов вашей задачи.можно сделать рекурсивно(навряд ли код выиграет от этого.скорее проиграет по скорости).
сожно ввести больше тегов-исключений.
ну, да я думаю вы сами дальше разберетесь.
у вас есть на руках два работающих куска кода.дерзайте

Assassin 08.03.2009 23:31

Эцсамое.... Всем спасибо за внимание, за попытку помочь) Видимо я не так истолковал цель, нихрена не сработало :(

Gvozd 09.03.2009 00:14

а по другому сформулировать цель слабо?
то. что вы попросили мы вам написали.
и оно работает.так, что изъясняйтесь более точно в следующий раз, чтобы не тратить свое, и ЧУЖОЕ время понапрасну.время знаете ли много стоит

Assassin 09.03.2009 00:44

Что ж, прошу прощения за ваше потраченное время.

Mak-Mak 15.03.2009 04:22

Gvozd спасибо
 
Gvozd спасибо, искал такой вот скриптик...!!! мне был нужен, что бы убирать из блока со ссылками tak.ru, надпись "Оплаченая реклама:" всё работает

300 27.06.2009 18:05

Подскажите, а как заменить строку <font tmp color=red> во всём тексте? Я не понимаю, как составить регулярное выражение.

str = new RegExp(/<font tmp color=red>/,'g')
так не работает.

300 27.06.2009 18:07

И ещё. Есть форма, в которое есть поле, например name=fld. Нужно взять из него значение и искать его на всей странице, а потом заменить на другое. Т.е. как использовать fld.value в глобальном поиске?

x-yuri 27.06.2009 18:20

Цитата:

Подскажите, а как заменить строку <font tmp color=red> во всём тексте?
зачем? Откуда берется текст, который нужно заменить?

Цитата:

Нужно взять из него значение и искать его на всей странице, а потом заменить на другое
опять же зачем это нужно?

300 27.06.2009 20:07

Это нужно для поиска и выделения найденных слов. Я написал такой код:

function reset()
{
 for (i=1; i<ta.length; i++)
  {
   ta[i].style.display = ''
  }
 afe = tbl.getElementsByTagName("font")
 if (afe.length != 0)
  {
   for (i=0; i<(afe.length); i++)
       if (afe[0].tmp == "yes") {afe[0].outerHTML = afe[0].innerHTML}
  }
}

 function find()
{
 reset()
 for (i=1; i<ta.length; i++)
  {
   txt = ta[i].innerText.toLowerCase()
   findstr = fnd.value.toLowerCase()
   if (txt.lastIndexOf(findstr) == -1) {ta[i].style.display = 'none'}
  }
 REstr = new RegExp(findstr,"gi")
 tbl.innerHTML = tbl.innerHTML.replace(REstr, '<font style="background-color:white; font-size:30" tmp="yes">' + findstr + '</font>')
}


Но почему-то не работает. Текст для поиска берётся из поля формы. Имя поля - fnd. tbl - это id таблицы. Смысл такой: если в данной строке есть это слово, то оно выделяется, т.е. происходит замена слова на слово с тегами. А если нет - строка скрывается.
Функция reset сбрасывает всё. При замене я вставил параметр tmp в тег font, чтобы по нему определять, какие теги font удалять при сбросе. Сброс сначала ищет все теги font в таблице, а потом удаляет те, у которые tmp=yes.

Но код почему-то не работает. Поправьте, кто знает.

x-yuri 27.06.2009 21:20

1) нету innerText, outerHTML в ff
2) не используй глобальные переменные
3) если создаешь regexp с помощью конструктора - добавляй ограничители (/)
4) при подстановке пользовательских данных в regexp их нужно экранировать
5) я бы не рискнул к таблице innerHTML применять. Лучше к ячейкам. Возможно лучше будет даже пройтись по всем текстовым нодам (смотри скорее с конца). Еще можешь почитать http://webew.ru/articles/598.webew

300 28.06.2009 16:10

1) нету innerText, outerHTML в ff
2) не используй глобальные переменные
3) если создаешь regexp с помощью конструктора - добавляй ограничители (/)
4) при подстановке пользовательских данных в regexp их нужно экранировать
5) я бы не рискнул к таблице innerHTML применять. Лучше к ячейкам. Возможно лучше будет даже пройтись по всем текстовым нодам (смотри скорее с конца). Еще можешь почитать http://webew.ru/articles/598.webew

1) Я работаю в IE. А что же аналогичное для пользователей ff?
3) Так, что ли:
REstr = new RegExp(/findstr/,"gi")
? Так не работает.
5) Спасибо, это сработало!

Riim 28.06.2009 16:24

Цитата:

Сообщение от 300
Я работаю в IE. А что же аналогичное для пользователей ff?

innerHTML

На счет "добавляй ограничители (/)" я тоже не понял.

Kolyaj 29.06.2009 12:23

Цитата:

Сообщение от 300
Я работаю в IE.

А скрипт только для себя пишете? Если нужен только текст, обычно берут innerHTML и удаляют из него теги.

Цитата:

Сообщение от Riim
На счет "добавляй ограничители (/)" я тоже не понял.

С PHP попутал наверно.

x-yuri 30.06.2009 13:48

Цитата:

А что же аналогичное для пользователей ff?
replaceChild (по поводу outerHTML)

Цитата:

С PHP попутал наверно
именно :)

Moor 01.03.2010 00:47

Други, помогите, пожалуйста, ибо я совсем не спец в JS.
На основе найденного здесь примера решил сделать скрипт, уменьшающий надписи на странице. Подгружаю как внешний скрипт, однако не работает. Что неверно в коде?
window.onload=function(){
document.body.innerHTML = document.body.innerHTML.replace(' 000 руб', '<small> 000 руб</small>');
}
Чую, что скорее всего дело в пробелах, однако выразить не могу (С) :)

bioz00 26.07.2010 00:14

Подскажите пожалуйста, как это скрипт заставить работать без учета регистра?

Цитата:

Сообщение от Gvozd (Сообщение 13860)
window.onload=function(){
all_elements=document.getElementsByTagName('*');
for(i=0,s=all_elements.length;i<s;i++)
	if(all_elements[i].tagName!="SCRIPT")
		for(j=0,s_=all_elements[i].childNodes.length;j<s_;j++)
			if(all_elements[i].childNodes[j].nodeType==3)
				all_elements[i].childNodes[j].textContent=all_elements[i].childNodes[j].textContent.replace(/AzriMan/g, 'AndryMan');
}


и еще, как по-грамотному переделать этот код для замены целого ряда слов, где каждое отдельное слово заменяется определенным значением?

рони 26.07.2010 01:39

Цитата:

Сообщение от Gvozd
textContent

наверно лучше использовать data вместо textContent Internet Explorer затыкаеться на textContent.
тогда скрипт для замены целого ряда слов будет примерно так выглядеть
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1251" />
  <title></title>
<script language="JavaScript" type="text/javascript">
function repl(a) {
    var b = {
        "111": "\u0437\u0430\u043c\u0435\u043d\u0430",
        "222": "\u043f\u0440\u043e\u0448\u043b\u0430",
        "333": "\u0443\u0441\u043f\u0435\u0448\u043d\u043e",
        "4": "!"
    };
    for (var c in b) {
        var d = RegExp(c, "gim");
        a = a.replace(d, b[c])
    }
    return a
};

window.onload = function () {
    all_elements = document.getElementsByTagName("*");
    i = 0;
    for (s = all_elements.length; i < s; i++) if (all_elements[i].tagName != "SCRIPT") {
        j = 0;
        for (s_ = all_elements[i].childNodes.length; j < s_; j++)
        if (all_elements[i].childNodes[j].nodeType == 3)
        all_elements[i].childNodes[j].data = repl(all_elements[i].childNodes[j].data)
    }
};
</script>
</head>
<body>
 <font color="#FF0000">111  222 333 444</font>
</body>
</html>

bioz00 26.07.2010 19:34

Дримвывер цс4 выдает ошибку в первой строке, если стереть первые три строки, ощибка появляется в десятой, где var b = {
я в jawa 0.01, поэтому сорри если туплю

bios 04.05.2011 19:47

function replaceHtml(el, html) {
	var oldEl = typeof el === "string" ? document.getElementById(el) : el;
	/*@cc_on 
		oldEl.innerHTML = html;
		return oldEl;
	@*/
	var newEl = oldEl.cloneNode(false);
	newEl.innerHTML = html;
	oldEl.parentNode.replaceChild(newEl, oldEl);
	return newEl;
};

HekracoB 11.11.2014 20:18

Доброго времени суток! Данный код
window.onload=function(){
    document.body.innerHTML=document.body.innerHTML.replace(/Лимон/g,'Яблоко');
}

отлично подходит для моей задачи, но есть одно "НО". Если в тексте встречается "Лимоны", то в итоге я получаю "Яблокоы". Подскажите, как сделать, чтобы код искал строго указанное слово? Ну а чтобы заменить "Лимоны" на "Яблоки", то, я так понимаю, нужно тиражировать код?

Sweet 11.11.2014 22:23

Цитата:

Сообщение от HekracoB
нужно тиражировать код

Нет, конечно. Вот, вникай:
function replace(string, source, replacer) {
	var x = source.slice(1).filter(notEmptyString);
	var ending = "(" + x.join("|") + ")";

	if (x.length == 1) ending += "?";

	var regExp = new RegExp(source[0] + ending, "g");
	
	return string.replace(regExp, handler);

	function handler(match, x) {
		return replacer[0] + replacer[source.indexOf(x || "")];
	}

	function notEmptyString(x) {
		return x;
	}
}

var test = "test Лимон test Лимоны test";
alert( replace(test, ["Лимон", "", "ы"], ["Яблок", "о", "и"]) );

Конечно, можно (и нужно) более элегантно и читаемо сделать, но мне лень - это сходу написано.


Часовой пояс GMT +3, время: 19:32.