Autor Zpráva
kabanos
Profil *
Jak upravit skript, aby se při nahrazování textu uloženém v proměnné nenahrazoval text v HTML tagech.
Příklad:
Mám
var text_hledany = 'spa';
var text_nahradni = '<span class="hightlight">'+text_hledany+'<\/span>';
var text_prohledavany = '<span class="space">Spal jsem ve spacím pytli.<\/span>';
var text_novy = text_prohledavany.replace(new RegExp(text_hledany,'g'),text_nahradni);

Výsledek by měl být:
<span class="space"><span class="hightlight">Spa<\/span>l jsem ve <span class="hightlight">spa<\/span>cím pytli.<\/span>
Ale je:
<<span class="hightlight">spa<\/span>n class="<span class="hightlight">spa<\/span>ce"><span class="hightlight">Spa<\/span>l jsem ve <span class="hightlight">spa<\/span>cím pytli.<\/<span class="hightlight">spa<\/span>n>

Jak upravit skript, aby ignoroval tagy a nahradil pouze čisté texty? Úplně odstranit tagy umim, ale potřebuji je tam.

Šlo by pak ještě nějak jednoduše upravit tento kód, aby nahrazoval případně více vložených slov?
např: var text_hledany = 'spa ve'; - aby toto bral jako dvě hledaná slova a ne jako jedno

Díky
Fred
Profil
asi by to šlo líp
var text_hledany='spa';
var text_vzor =text_hledany+'(?![^<>]*>)'; 
var text_nahradni = '<span class="hightlight">'+text_hledany+'<\/span>'; 
var text_prohledavany = '<span class="space">Spal jsem ve spacím pytli.<\/span>'; 
var text_novy = text_prohledavany.replace(new RegExp(text_vzor,'ig'),text_nahradni); 
Chamurappi
Profil
Reaguji na kabanose:
např: var text_hledany = 'spa ve'; - aby toto bral jako dvě hledaná slova a ne jako jedno
Použij '(spa|ve)'.
_es
Profil
Fred:
Tvoj kód nerieši class="space">.
Nejaký jednoduché 100% fungujúce riešenie sa asi takýmto spôsobom spraviť nedá.
100% funkčnosť by sa asi dala spraviť, ak by tie HTML elementy boli naozaj vytvorené a potom by bol postupne nahradzovaný ich textový obsah.
Fred
Profil
Tvoj kód nerieši class="space"? Řeší, vždyť jsem to zkoušel.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script>
function bla(){ 
var text_hledany='spa';
var text_vzor =text_hledany+'(?![^<>]*>)'; 
var text_nahradni = '<span class="hightlight">'+text_hledany+'<\/span>'; 
var text_prohledavany = '<span class="space">Spal jsem ve spacím pytli.<\/span>'; 
var text_novy = text_prohledavany.replace(new RegExp(text_vzor,'ig'),text_nahradni); 
alert(text_novy)
}
window.onload=bla;
</script>

_es
Profil
Fred:
Řeší, vždyť jsem to zkoušel.
Áno, v tom som nemal pravdu.
No nie je to riešenie s celkom zaručeným výsledkom. Napríklad sa môže v nejakom atribúte nejakej značky vyskytnúť znak '<'.
kabanos
Profil *
Ahoj, moc díky.
Řešení, která jste mi napsali jsou bezva.
Bylo by ještě nějak možné udělat ještě nějakou úpravou kódu, která by zvýrazněnému textu nezměnila velikosti písmen?

Bohužel mi to zatím udělá toto:
<span class="space"><span class="hightlight">spa<\/span>l jsem ve <span class="hightlight">spa<\/span>cím pytli.<\/span>
místo
<span class="space"><span class="hightlight">Spa<\/span>l jsem ve <span class="hightlight">spa<\/span>cím pytli.<\/span>

_es:
V prohledávaných textech znak '<' v atributech nemám a ani tam nikdy nebude (naštěstí), ale díky za upozornění.
_es
Profil
kabanos:
Bylo by ještě nějak možné udělat ještě nějakou úpravou kódu, která by zvýrazněnému textu nezměnila velikosti písmen?

Uprav si jeden riadok toho Fredovho kódu:
var text_nahradni = '<span class="hightlight">$&<\/span>';
kabanos
Profil *
Super, moc díky:-)
Fred
Profil
Ještě jsem si s tím hrál a netuším jak vyřešit odstranění toho spanu v IE6, ono totiž ten kód přegeneruje dle svého.

celý příklad co zkouším:
<style type="text/css">
.hightlight{font-weight:bold;color:red;}
</style>
<form action="#" id="form">
<input type="text" id="query" value="lorem">
<input type="submit" value="Search and highlight">
</form>
<div id="scanned">
Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Typi non habent claritatem insitam; est usus legentis in iis qui facit eorum claritatem. Investigationes demonstraverunt lectores legere me lius quod ii legunt saepius. Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula quarta decima et quinta decima. Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum.
</div>
<script type="text/javascript">
function hightligth_search_query(){
document.getElementById('form').onsubmit=function(){
var scanned=document.getElementById('scanned').innerHTML; 
if(document.uniqueID){var remove_replacement='<SPAN class=hightlight>([^<]*)</SPAN>';}
else{var remove_replacement='<span class="hightlight">([^<]*)</span>';}
var new_scanned=scanned.replace(new RegExp(remove_replacement,'ig'),'$1'); 
document.getElementById('scanned').innerHTML=new_scanned;
var sq=document.getElementById('query').value;
var pattern=sq+'(?![^<>]*>)'; 
var replacement='<span class="hightlight">$&</span>'; 
var result=new_scanned.replace(new RegExp(pattern,'ig'),replacement); 
document.getElementById('scanned').innerHTML=result;
return false;
};
}
window.onload=hightligth_search_query;
</script>


jak by ste řešili tyto dva řádky?
if(document.uniqueID){var remove_replacement='<SPAN class=hightlight>([^<]*)</SPAN>';}//msie
else{var remove_replacement='<span class="hightlight">([^<]*)</span>';}//ostatni
kabanos
Profil *
Ahoj,
při testování výše uvedených skriptů jsem narazil na problém s tím, pokud dám do vyhledávacího inputu např. vyhledat některý ze znaků + ( ) ? * ,..... (regulární značky), tak to nahlásí chyby. Jde to nějak jednoduše ošetřit? (např. nějakým převaděčem regulárních značek v inputu na HTML entity (http://www.jakpsatweb.cz/html/entity-vsechny.html)
Nebo jinak?

Díky
_es
Profil
kabanos:
Jde to nějak jednoduše ošetřit?
Musíš dať pred každý taký znak opačné lomítko.
Teda v skripte nahrádzať napríklad '+' za '\+'.
kabanos
Profil *
Našel jsem si na netu toto:
function encodeRE(s) {return s.replace(/[.*+?^${}()|[\]\/\\]/g, '\\$0');}
Snad to nemá nějaké mouchy:-)

Díky

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: