Newsgroup: it.comp.lang.javascript
Titolo: regular expression per pulire i tag html

salve a tutti,
non ci riesco, sto provando in tutti i modi
e devo ammettere che non sono fortissimo sulle reg.exp.
il problema e' questo:
gli utenti copiano e incollano articoli dal web,
dal testo che loro incollano io devo eliminare
1)tutti gli attributi dei tags ( id,class...)
2)eliminare tutti i tag diversi da <p> e </p>
finora ho tirato fuori questo:
strToReplace =
strToReplace.replace(/<[^\<p>][^\</p>](\s*[\s\S]*?\s*)?>/ig, '');
//Clear all comments
strToReplace = strToReplace.replace(/<!(?:--[\s\S]*?--\s*)?>\s*/g,'');
non so come pulire gli attributi dei tags...e il pattern per eliminare
i tag diversi da <p> non funziona benissimo
grazie per l'aiuto
marco

 2)eliminare tutti i tag diversi da <p> e </p>
Io farei una prima sostituzione di tutti i <p> </p> con una stringa balorda
replace(<p.[^>]*>,'§§%%ŁŁ')
poi elemino tutti i tag
replace(<.[^>]*>,'')
poi rimetto a posto i <p>, fregandomene di align, class, style e altro
replace(§§%%ŁŁ,'<p>')
Non saprei per ora perň come differenziare il paragrafo chiuso da quello 
aperto... una soluzione brevimano č replace(§§%%ŁŁ,'</p><p>')...
Alex

 2)eliminare tutti i tag diversi da <p> e </p>
[CUT]
Ti restano anche i tag "autochiusi" (come dici te ti lascerebbe un <br/> o
un <input.../>, per esempio). Devi valutare se questo può causarti
problemi.
Da considerare inoltre tag aperti e non chiusi (es. per html la chiusura
della td non è obbligatoria).
Comunque sia, per quello che richiedi io farei un qualcosa di simile (str è
la stringa in cui rimuovere quello che richiedi):
var r=/<(\w{1})([^>]*)>(.*)<\/\1>/gmi;
  var ris=str.replace(r,
   function(s,tag,attr,inner) {
    return (tag.toUpperCase()=="P"?"<"+tag+">"+inner+"</"+tag+">":"");
   }
  );
p.s. quanto sopra rimuove i tag diversi da p *E TUTTO CIO' CHE VI E'
CONTENUTO*. Io la richiesta la ho capita così; se vuoi mantenere ciò che vi
è contenuto nella function basta restituire inner anziché "" (nel caso sia
diverso da p), del tipo quindi
    return (tag.toUpperCase()=="P"?"<"+tag+">"+inner+"</"+tag+">":inner);
 
-- 
"Ti sei salvato
 o sei entrato in banca pure tu?"
									    A.V.

     return (tag.toUpperCase()=="P"?"<"+tag+">"+inner+"</"+tag+">":inner);
grazie
dell'aiuto
al piů presto metterň in pratica i tuoi consigli e posterň il risultato
ciao!
m


 che è contenuto all'interno degli span,td,div e compagnia...
Quindi deve rimanere anche ciò che è contenuto nel tag <p></p> o no?
Sinceramente non vedrei motivo di cancellarne il contenuto, si rischierebbe
di perdere informazioni.
Nel caso tu voglia mantenere tale eventuale testo, la regexp risultante
dovrebbe essere qualcosa del tipo:
var re=/(<\/?p)(?:\s[^>]*)?(>)|<[^>]*>/gi;
 
alert( str.replace(re,"$1$2") );
Non ho fatto test approfonditi, ma dovrebbe andare.
P.S.
Mi raccomando di fare questo genere di controlli anche lato server, prima
di salvare l'articolo. Perché questo genere di controlli sul browser
possono sempre essere elusi facilmente.
-- 
ZER0
~ "Lord Pando è il mio orsacchiotto di pezza.
Si veste di nero, si fa dei tatuaggi in faccia e dice
che è passato al Lato Oscuro, ma secondo me è solo l'adolescenza!"


purtroppo niente da fare... non ne funziona nessuna...e non riesco a
fixarle per farle funzionare...
zero la tua mi cancella tutti i tag!
vi faccio un esempio visto che non riesco a spiegarmi:
cio che intendo per "eliminare i tag diversi da <p> ed eliminare gli
attributi di quest'ultimo" e' questo:
  dato questo testo
-------------------------------------------------------
<div id="aaa">testo dentro al div</div><span class="bbb"> testo dentro
allo span</span><img src="blabla"/><p class='ccc'
style='blablabla'>testo dentro al <b style="FONT-SIZE:
14px">paragrafo</b> con tag annidato</p>
-------------------------------------------------------
  devo ottenere
-------------------------------------------------------
testo dentro al div testo dentro allo span<p>testo dentro al paragrafo
con tag annidato</p>
-------------------------------------------------------
io sto trovando enormi difficolta' non ci riesco! sto al limite delle
crisi esistenziali!
grazie per l'aiuto!


 purtroppo niente da fare... non ne funziona nessuna...
La mia funziona direi sicuramente (funziona rispetto alla tua domanda, come
ti dicevo nel mio replay), la hai testata?
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 -------------------------------------------------------
Che, come ti ho appena mostrato, è esattamente ciò che fa la regexp che ti
ho scritto.


 La mia funziona direi sicuramente 
Anche la mia, e se nessuna di queste "gli funziona", direi che il problema
sta altrove.


 sta altrove.
Giammai mi sarei permesso di dire che la tua era toppata, l'eresia non mi
si confà... :-)
-- 
"That until there is no longer first class
And second class citizens of any nation
Until the colour of a man's skin
Is of no more significance than the colour of his eyes
Me say war"
B.M.

 l'eresia non mi si confà... :-)
Non fraintendermi, non era questo che intendevo dire :)
Dicevo solo che se sia la mia che la tua sono entrambe corrette, e a lui
non funzionano, allora il problema quasi sicuramente non si trova nelle
regexp in sé.
Passi un caso, ma due su due... :)


l'ho testata...
ecco la funzione:
function clearTags() {
var stringToReplace = String(document.theform.ArticleText.value);
 var r=/<(\w{1})([^>]*)>(.*)<\/\1>/gmi;
 document.theform.ArticleText.value = stringToReplace.replace(r,
 function(s,tag,attr,inner) {
    return
(tag.toUpperCase()=="P"?"<"+tag+">"+inner+"</"+tag+">":inner);
 }
 );
}
-----------------------------------------------------
document.theform.ArticleText.value contiene:
<div id="aaa">testo dentro al div</div><span class="bbb">testo dentro
allo span</span><img src="blabla" /><p>testo dentro al <b
style="FONT-SIZE: 14px">paragrafo</b> con tag annidato</p>
chiamo la funzione clearTags():
ed ottengo:
<div id="aaa">testo dentro al div</div><span class="bbb">testo dentro
allo span</span><img src="blabla" /><p>testo dentro al <b


   dato questo testo
-------------------------------------------------------
<div id="aaa">testo dentro al div</div><span class="bbb"> testo dentro
allo span</span><img src="blabla"/><p class='ccc'
style='blablabla'>testo dentro al <b style="FONT-SIZE:
14px">paragrafo</b> con tag annidato</p>
applicando la regExp ottengo:
testo dentro al divtesto dentro allo spantesto dentro al paragrafo con
tag annidato
function clearTags(){
var stringToReplace = String(document.theform.ArticleText.value);
 var re=/(<\/?p)(?:\s[^>]*)?(>)|<[^>]*>/gi;
 document.theform.ArticleText.value = stringToReplace.replace(re,'');
}
non riesco proprio a capire come fanno a funzionare a voi!!?
il javascript non e' il mio linguaggio, ma per funzioni cosi semplici
non penso di aver commesso errori...o quantomeno non vengono generati
ciao
m

 non penso di aver commesso errori...o quantomeno non vengono generati
Eh, non esistono solo errori sintattici. Magari. In verità quelli sono i
minori.
-- 
ZER0
~ Legge dell'Amplificazione sonora
Nello spazio i rumori delle esplosioni si trasmettono ancora meglio perché
non c'è l'aria a trattenerli. (La Fisica nei Cartoni)
on air ~ "Zero Assoluto - Semplicemente"

 non c'č l'aria a trattenerli. (La Fisica nei Cartoni)
