Замена слова посредством Java-script
Здравствуйте, ребята. Хотел бы обратиться к вам за помощью. Мне нужен скрипт, код которого нужно вставить в тело страницы, чтобы на этой странице происходила замена слова на другое (прописанные в скрипте). В Java не силён, потому прошу вас помочь. Заранее премного благодарен (:
|
Цитата:
|
Это объясняется моим незнанием Java-script. Попробую показать на пальцах.
Например у нас есть страница. Много, много букв, и где-то встречается слово 'пельмень'. Затем, в страницу вставляется скрипт. На той же странице, всё так же много, много букв, но вместо 'Пельменя' мы видим 'Укроп'. А замена слова непосредственно осуществляется скриптом, где указано, что на что менять. Вот этот скрипт я и ищу. Вы уж простите за нелепость, объяснил как смог. Кто-нибудь знает как осуществить замысел? |
может лучше что-то типа orphus ?
иначе объясни зачем менять пельмень на укроп? Какова цель? |
Хм... Нет, мне не орфографию менять надо. Приведу ещё одну аналогию. На сайте замечана пассивная xss, хочу на страничке изменить слово. В моём распоряжении всего одна форма, куда можно подгрузить свой скрипт. Вот и ищу простенький скрипт замены слова.
|
а вы думаете скрипт будет автоматически выполняться? я что-то всё равно не пойму какая конечная цель :)
|
Я надеюсь (:
Представим на секунду, что в поле отправки сообщения на данном форуме не фильтруется ничего. Я вставляю сюда скрипт, и после отправки, на странице вместо ника AzriMan будет, например, AndryMan. |
Цитата:
document.body.innerHTML = document.body.innerHTML.replace('AzriMan', 'AndryMan');Грубо конечно :) |
Assassin, т.е. цель - защита от XSS атак?
|
x-yuri,
полагаю, что наоборот)))) |
Цитата:
Цитата:
Цитата:
|
Ребят? Неужели никто не поможет? ):
|
так ведь чтобы помочь нужно знать цель - "для чего это все?"
|
не знаю почему у вас не работает этот код.
по крайней мере на простейших страницах он срабатывает. вот, мой пример рабочей страницы <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'); } менее компактно. возмжно более медлено.хотя не факт. возможно быстрее даже на больших документах. во всяком случае в этом коде не происходит перерисовки всего дерева, как в предыдущем коде. в общем, потестите. Код можно изменять и дополнять разными способами, от разных аспектов вашей задачи.можно сделать рекурсивно(навряд ли код выиграет от этого.скорее проиграет по скорости). сожно ввести больше тегов-исключений. ну, да я думаю вы сами дальше разберетесь. у вас есть на руках два работающих куска кода.дерзайте |
Эцсамое.... Всем спасибо за внимание, за попытку помочь) Видимо я не так истолковал цель, нихрена не сработало :(
|
а по другому сформулировать цель слабо?
то. что вы попросили мы вам написали. и оно работает.так, что изъясняйтесь более точно в следующий раз, чтобы не тратить свое, и ЧУЖОЕ время понапрасну.время знаете ли много стоит |
Что ж, прошу прощения за ваше потраченное время.
|
Gvozd спасибо
Gvozd спасибо, искал такой вот скриптик...!!! мне был нужен, что бы убирать из блока со ссылками tak.ru, надпись "Оплаченая реклама:" всё работает
|
Подскажите, а как заменить строку <font tmp color=red> во всём тексте? Я не понимаю, как составить регулярное выражение.
str = new RegExp(/<font tmp color=red>/,'g') так не работает. |
И ещё. Есть форма, в которое есть поле, например name=fld. Нужно взять из него значение и искать его на всей странице, а потом заменить на другое. Т.е. как использовать fld.value в глобальном поиске?
|
Цитата:
Цитата:
|
Это нужно для поиска и выделения найденных слов. Я написал такой код:
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. Но код почему-то не работает. Поправьте, кто знает. |
1) нету innerText, outerHTML в ff
2) не используй глобальные переменные 3) если создаешь regexp с помощью конструктора - добавляй ограничители (/) 4) при подстановке пользовательских данных в regexp их нужно экранировать 5) я бы не рискнул к таблице innerHTML применять. Лучше к ячейкам. Возможно лучше будет даже пройтись по всем текстовым нодам (смотри скорее с конца). Еще можешь почитать http://webew.ru/articles/598.webew |
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) Спасибо, это сработало! |
Цитата:
На счет "добавляй ограничители (/)" я тоже не понял. |
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Други, помогите, пожалуйста, ибо я совсем не спец в JS.
На основе найденного здесь примера решил сделать скрипт, уменьшающий надписи на странице. Подгружаю как внешний скрипт, однако не работает. Что неверно в коде? window.onload=function(){ document.body.innerHTML = document.body.innerHTML.replace(' 000 руб', '<small> 000 руб</small>'); }Чую, что скорее всего дело в пробелах, однако выразить не могу (С) :) |
Подскажите пожалуйста, как это скрипт заставить работать без учета регистра?
Цитата:
и еще, как по-грамотному переделать этот код для замены целого ряда слов, где каждое отдельное слово заменяется определенным значением? |
Цитата:
тогда скрипт для замены целого ряда слов будет примерно так выглядеть <!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> |
Дримвывер цс4 выдает ошибку в первой строке, если стереть первые три строки, ощибка появляется в десятой, где var b = {
я в jawa 0.01, поэтому сорри если туплю |
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; }; |
Доброго времени суток! Данный код
window.onload=function(){ document.body.innerHTML=document.body.innerHTML.replace(/Лимон/g,'Яблоко'); } отлично подходит для моей задачи, но есть одно "НО". Если в тексте встречается "Лимоны", то в итоге я получаю "Яблокоы". Подскажите, как сделать, чтобы код искал строго указанное слово? Ну а чтобы заменить "Лимоны" на "Яблоки", то, я так понимаю, нужно тиражировать код? |
Цитата:
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. |