Замена слова посредством 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, время: 18:51. |