Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Замена слов в тексте (https://javascript.ru/forum/misc/3056-zamena-slov-v-tekste.html)

Dan T 13.03.2009 22:36

Замена слов в тексте
 
Приветствую,
два дня бьюсь - не могу решить такую задачу:
Есть список слов:
kayword1,keyword2,keyword3
как по окончанию загрузки страницы - заменить в ней все слова из списка(первые N раз) на super_keyword1,super_keyword2 и super_keyword3 соответственно.
Вожусь с var.replace и регулярками,но
основные проблемы две - как заменять слова только в тексте,а не в тегах, т.к. иногда слово display попадается в том же css и такая замена полностью рушит структуру страницы
и как почему-то при замене страничка моргает(хотя может ето именно следствие нарушения ее структуры из-за замены в тегах)
Если кто-то сталкивался с подобной задачей - подскажите плз решением.
Спасибо

Treekci 13.03.2009 23:19

Читали данный топик? http://javascript.ru/forum/misc/2946...va-script.html

Gvozd 13.03.2009 23:21

юзайте поиск получше, прежде чем плодить темы
внизу вашей темы есть список "Похожие темы"
там есть эта тема
там мною выложен код, и в него даже можно добавлять теги-исключения.
и он не заставляет страницу мигать

Dan T 14.03.2009 00:01

Конечно читал :) Перед тем как написать довольно долго искал ответ в сети....
При помощи решения, казанного в данном топике (именно вариант через DOM) у меня не получается заменить keyword1 на <b>keyword1</b> или на <a href="">keyword1</a>
т.е. замена происходит так, что теги считаются как текст. И попросту выделить определенный слова жирным не получается :-(
Если подскажете как оптимизировать то решение под эти нужды - было бы здорово.
Спасибо!

Gvozd 14.03.2009 01:06

вот намучил кажется:
function replace_all(str1,str2)
{
regexp=new RegExp(str1,"g")
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)
                {
				if(regexp.test(all_elements[i].childNodes[j].textContent))
					{
					all_text=all_elements[i].childNodes[j].textContent
					
					text=all_text.substr(0,all_text.indexOf(str1))
					left=document.createTextNode(text)
					
					//оборачиваем найденный текст внутрь тега <B>
					middle=document.createElement('b');//ТУТ ставится тег в который мы хотим обернуть.
					//text=all_text.substr(all_text.indexOf(str1),str1.length)
					middle.appendChild(document.createTextNode(str2))
					//-------------------------------------------------------------------------------------------
					
					text=all_text.substring(all_text.indexOf(str1)+str1.length,all_text.length)
					right=document.createTextNode(text)
					
					all_elements[i].childNodes[j].textContent=""
					all_elements[i].insertBefore(left,all_elements[i].childNodes[j])
					all_elements[i].insertBefore(middle,all_elements[i].childNodes[j])
					all_elements[i].insertBefore(right,all_elements[i].childNodes[j])
					}
				}
                
}
window.onload=function(){
replace_all("AzriMan"," AndryMan ");

}

HTML для тестирования
<html>
<head>
</head>
<body>
qwe<br/>
azriMan<br/>
qwe<br/>
<table border="1">
    <tr>
        <td>a_AzriMan_x</td><td>AzriMa_n</td>
    </tr>
    <tr>
        <td>AzriM_an</td><td>AzriMa_n</td>
    </tr>
</table>b_AzriMan_y<br/>
</body>
</html>

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

Gvozd 14.03.2009 01:09

Блин.
пришло еще одно решение попроще и поуниверсальней.
генерим временный элемент.
его innerHTML элементарными текстовыми заменами заменами присваиваем все что надо.
затем чистим исходный текстовый нод в документе, и преед ним по очереди аттачим ноды временного элемента.

короче, я сказал несоклько вараинтов и код.пробуйте, творите дальше

Dan T 18.03.2009 11:31

pri ispolzovanii koda na bolshih stranicah proishodit peremeshivanija teksta:-(
k primeru pri zamene slova "objects" fraza:
In addition to the built-in JavaScript objects, you can also access and manipulate all of the HTML DOM objects with JavaScript.
prevrashaetsa v:
, you can also access and manipulate all of the HTML DOM objects with JavaScript. objects In addition to the built-in JavaScript

i tak dalee :-( inogda eto voobshe srezaet 4ast predlogenija:-(
N strani4kah s o4en prostoj strukturoj - kod rabotaet, a esli eto obi4naja stranica - to ne rabotaet :-(
Proboval na etoj styranice:
http://www.w3schools.com/js/js_obj_htmldom.asp
Prosto sohranil ee na HDD, vstavil script zameni i zapustil v browsere.
dva dnja igralsja - tak i ne smog po4enit :-( moget podskagete kak popravit kod, 4to b on otrabatival korrektno? (moi znanija DOM ne nastolko silni)
spasibo bolshoe!
PS: prostite za translit - net russkoj klaviaturi sej4as:-(

Gvozd 18.03.2009 12:21

http://translit.ru вам в помощь.
Цитата:

Сообщение от Dan T
при исползовании кода на больших страницах происходит перемешивания текста:-(
к примеру при замене слова "objects" фраза:
In addition to the built-in JavaScript objects, you can also access and manipulate all of the HTML DOM objects with JavaScript.
превращается в:
, you can also access and manipulate all of the HTML DOM objects with JavaScript. objects In addition to the built-in JavaScript

и так далее :-( иногда ето вообше срезает часть предложения:-(
На страничках с очен простой структурой - код работает, а если ето обычная страница - то не работает :-(
Пробовал на етой странице:
http://www.w3schools.com/js/js_obj_htmldom.asp
Просто сохранил ее на HDD, вставил скрипт замены и запустил в браузере.
два дня игрался - так и не смог починить :-( может подскажете как поправить код, что б он отрабатывал корректно? (мои знания ДОМ не настолько силны)
спасибо большое!
ПС: простите за транслит - нет русской клавиатури сей4ас:-(


Gvozd 18.03.2009 12:36

я же говорил, что:
Цитата:

Сообщение от Gvozd
единственный минус, если в пределах одной текстовой ноды несколько совпадений, обрабатывается только первое.

на самом деле, у меня бащка ужде не варила, и я немного неугадал с глюком.но то что он будет я знал
Цитата:

Сообщение от Dan T
знания ДОМ не настолько силны)

у меня сильны можно подумать?
я сидел с кучей справок и матерился по поводу некросбраузерности некоторых DOM-методов, что весьма усложняло код

Цитата:

Сообщение от Dan T
может подскажете как поправить код, что б он отрабатывал корректно?

да.
берете текстовую ноду, и обрабатываете все вхождения подстроки.
лучше всего регекспами обработать, разбив строку на куски, и склеив обратно уже силами DOM. обрабатывать все вхождения, а не как я в первый раз халтурить.

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


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