replace e innerhtml

  • Creatore Discussione Creatore Discussione Filoz
  • Data di inizio Data di inizio

Filoz

Nuovo Utente
6 Feb 2007
12
0
0
37
www.equiweb.it
ciauz a tutti, ho un grosso problema...dopo diverse molte di documentazione ero arrivato a creare uno script funzionante per effettuare il replace di termini contenuti nel body, aggiungendo ad essi anche una formattazione html.
il problema è nato dal fatto che il testo per il replace poteva trovarsi anche in una tabella, un paragrafo ecc...

ho cercato in internet un "aiuto" e ho trovato questo fantastico script
http://snippets.dzone.com/posts/show/4490#related ...eccolo
Codice:
var words={
'Bill':'William','Miss':'Mrs'
}
var regs=[];
for(arg in words){regs[regs.length]=new RegExp(arg,'g')}

window.onload=function replaceText(){
var tags=document.getElementsByTagName('body')[0].getElementsByTagName('*');
var i=0,t;
	while(t=tags[i++]){
		if(t.childNodes[0]){
			var j=0, c;
			while(c=t.childNodes[j++]){
				if(c.nodeType==3){
					var k=0;
					for(arg in words){
						c.nodeValue=c.nodeValue.replace(regs[k],words[arg]);
						k++;
					}
				}
			}
		}
	}
}
l'array delle parole per il replace è questo:
Codice:
var words={
'Bill':'William','Miss':'Mrs'
}

se io volessi fare una cosa di questo tipo
Codice:
var words={
'Bill':'<strong>William</strong>','Miss':'<em>Mrs</em>'
}
lo script farebbe correttamente il replace...ma mi mostrerebbe a schermo il codice html...
bisogna dunque utilizzare innerHTML, il fatto è che nn riesco in nessun modo ad adattare lo script per farlo funzionare...

spero davvero che qualcuno mi possa aiutare...
ciauz e grazie a tutti
 
Ultima modifica:
si...ma nulla a che vedere con l'adv.

nel mio sito vengono spesso utilizzati termini "tecnici" che non tutti conoscono...
ho creato un sistema per l'enciclopedia... che funziona perfettamente nel sito (il replace viene fatto lato server)
mi piacerebbe poter implementare il sistema enciclopedia anche nel forum, così quando un utente utilizza una parola presente nell'enciclopedia automaticamente ne viene aggiunto il link (sto studiando come mostrarne anche il significato breve con ajax)
nel forum una soluzione lato server appensentirebbe troppo le pagine...quindi ho optato una per quella lato client.

che funziona così... con php leggo tutte le parole restituisco l'array javascript delle parole e creo una sorta di file cache js che aggiorno più volte al giorno.

poi l'altra parte dello script è composta dal codice sopra riportato che serve a leggere tutto il testo nella pagina e, se vi è qualche parole presente anche nell'enciclopedia, vi aggiunge il tag <strong> (era per prova...poi utilizzaerò il link)

spero di essermi chiarito...
ciauzzz e grazie
 
Si ok, ho detto eDintorni perchè il sistema è simile, non volevo alludere all'ADV :)

Per quanto interessante sarebbe farlo in Javascript non pensi sia meglio (e più semplice) farlo in ASP o in PHP, o il linguaggio che usi come server-side?

In questo modo, se hai delle pagine di descrizione ed hoc e non dei tooltip, fai anche indicizzazione.

Fammi sapere!
 
ciauzz grazie ancora per l'aiuto!

ti mostro il "mio" sistema http://www.equiweb.it/enciclopedia/scheda/1/governo-della-mano-il-governo-della-mano/
quella è una voce dell'enciclopedia e, come vedrai, alcune parole hanno una sottolineatura particolare, prova (dopo che la pagina è stata completamente caricata) a passarci su col mouse... e poi a cliccare...

qul sistema è ottimo per il sito... perchè faccio il replace direttamente ramite php e poi creo una vesione cache del testo già formattato...
è fatto in modo da essere anche più gradito ai motori di ricerca (infatti non utilizzo ajax...ma il testo che viene mostrato al passaggio del mouse è preso dall'attributo title del link)

per il forum invece... preferirei farlo lato client...perchè se dovessi ogni volta che carica la pagina effettuare il replace lato server il caricamento si rallenterebbe notevolmente...
se invece facesi il replace in fase di salvataggio del post... dovrei anche prestare attenzione quando l'utente modifica il suo messaggio...perchè si troverebbe dei collegamenti che lui nn ha inserito.

dunque ho ritenuto l'alternativa lato client la più soddisfacente:
- non rallenta la pagina (se nn di pochissimo per caricare l'array delle parole) poichè viene eseguito subito dopo che la pagina è stata caricata
- con qualche piccola modifica può essere facilmente adattabile anche per un servizio esterno (ad esempio permettere ai siti che lo desiderano di sfruttare il sistema enciclopedia del mio sito)

il mio unico problema è che conosco poco il dom...mi sono documentato più possibile...avevo creato un mio script funzionante... ma che però aveva il difetto di funzionare solo per il testo contneuto in body...e non in eventuali tabelle o paragrafi.
ho trovato quel fantastico codice che funziona perfettamente...ma non riesco a adattare l'innerhtml in modo da rendere il tag <a> attivo...
perchè se lascio solamente
Codice:
[B]c.nodeValue=c.nodeValue.[/B]replace('...', '...')
me lo considera anche l'html come testo...

ci sto provando da due giorni...ma nn riesco a saltarne fuori...

ti ringrazio ancora per l'aiuto

ciauzz
 
ho cambiato "strategia", ho pensato come poter risolvere il problema senza dover utilizzare i nodi...e ci son riuscito :-)

ecco il codice
Codice:
var regs=[];
for(arg in words){regs[regs.length]=new RegExp('[ \r]{1}'+words[arg]+'[ \,\.]{1}','i')}

window.onload=function replaceText(){
var tags=document.getElementsByTagName('body')[0].getElementsByTagName('td');
var i=0,t,k,codice;
   while(t=tags[i++]){
      //controllo che sia il td dei post..altrimenti passo oltre
      if(t.className == 'postbody'){
         codice = t.innerHTML;
         k=0;
         for(arg in words){
            codice = codice.replace(regs[k],' <a href="http://www.equiweb.it/enciclopedia/scheda/'+ arg +'/" id="'+ words[arg] +'"  class="enciclopedia_over" target="_blank" title="Leggi il significato di questa parola">' + words[arg] +'</a> ');
            k++;
         }
         t.innerHTML = codice;
      }

   }
}

mi rimane solo un ultimo problema che, nonostante mi sia documentato per molte ore, non riesco a risolvere...
il problema riguarda l'espressione regolare: sto cercando di scrivere un espressione che non mi faccia il replace anche di mezzeparole (esempio sciao, ciaoz), quello che voglio io invece è la corrispondenza esatta...

ho provato in tutti i modi...ma proprio nn ci riesco... addirittura in certi casi mi "mangia" una lettera.
un altro grosso problema è che non deve fare il replace se la parola è preceduta da <a[qualcosa]parola</a> (per qualcosa intendo dire che non è importante quella parte...ma i due caratteri prima)

ti sarei davvero grato se riuscissi a darmi un aiuto a fare in modo che l'espressione regolare qui sopra trovi la parola esatta e che non tocchi i link.

ciauz e grazie ancora dell'aiuto
 
Ultima modifica:

Discussioni simili