Newsgroup: it.comp.lang.javascript
Titolo: Mi aiutate con una RegExp?

Ho postato questa richiesta anche su it.comp.www.asp, tanto le Regular 
Expression sono sempre Regular Expression, ma non sono riuscito a trovare 
una risposta.
Devo trovare una RegExp che mi trovi in un testo la parola indicata ma solo 
se al di fuori dei tag e non dentro ai tag.
Per capirci:
Sostituire "ciccio" in: Ciccio ciccione, cosi' <a href="ciccio.asp" 
title="ciccionissimo">ciccione</a> che dirgli <span 
class="ciccionone">ciccionissimo</span> non basta <hr class="ciccionello" />
con "XXXXXX" mi deve riportare:
XXXXXX XXXXXXne, cosi' <a href="ciccio.asp" 
title="ciccionissimo">XXXXXXne</a> che dirgli <span 
class="ciccionone">XXXXXXnissimo</span> non basta <hr class="ciccionello" />
e non:
XXXXXX XXXXXXne, cosi' <a href="XXXXXX.asp"
title="XXXXXXnissimo">XXXXXXne</a> che dirgli <span 
class="XXXXXXnone">XXXXXXnissimo</span> non basta <hr class="XXXXXXnello" />
Non ci riesco, mi aiutate? :( 

 una risposta.
mahh... se lo dici tu
con tutte quelle xxx non ho capito molto
questa e in js non ti garantisco che funziona su asp
forse una guardata su msdn sarebbe meglio
<script language="JavaScript" type="text/JavaScript">
//il contenuto di reg su una sola riga
var reg ='Ciccio ciccione, cosi <a href="ciccio.asp"
title="ciccionissimo">ciccione</a> che dirgli <span
class="ciccionone">ciccionissimo</span> non basta <hr class="ciccionello"
/>';
//elimina i tag html
var tr = reg.replace(/<[\/\!]*?[^<>]*?>/gi,'' );
//ti cerca la parola che contiene ciccio
//e la inciccia
document.write(tr.replace(/(ciccio\w*\s*)/gi,'<b>$1</b>'));
</script>

 document.write(tr.replace(/(ciccio\w*\s*)/gi,'<b>$1</b>'));
Gia', ma ora quella stringa non mi serve piu' a nulla dato che e' spogliata 
dei tag!

 Con una regex non ce la fa, 
Ce la fa, ce la fa.
All'epoca feci qualcosa di analogo per sostituire dei caratteri di commento 
che però non fossero contenuti in una stringa. Il discorso è analogo.
La cosa può essere fatta usando due approcci: o "regexp" pura, che è 
ovviamente la strada un po' più lunghetta (mi ricordo che mi venne una 
regexp non da ridere); oppure utilizzando una funzione di callback, 
approccio che io sinceramente tendo ad utilizzare il meno possibile per una 
serie di ragioni; ma - come dissi l'ultima volta per l'eval - "quando ce 
vo', ce vo' ".. 
Ovviamente il secondo approccio rende il tutto più facile; ma c'è da dire 
che diventa anche meno portabile (non tutti i linguaggi supportano funzioni 
di callback per il replace), e qui mi ricollego a quanto detto da visuddhi: 
"tanto le Regular Expression sono sempre Regular Expression".
-- 
ZER0
~ .. six thousand and fifty two days, two hours, fifty four minutes, twelve seconds.
That is when the world ended.

 che però non fossero contenuti in una stringa. Il discorso è analogo.
e si puo' vedere? :)




Il fatto è che non la ritrovo più :) La feci "on the fly" quand'ero a casa
dello Scartabelli, almeno un anno buono fa, perché un mio amico mi chiese
di aiutarlo nello sviluppare tale regexp.. Dovrei rimettermi a riscriverla,
e mi ci vuole un po' di tempo.
Se usi la callback, invece, è immediato. :) Per quale linguaggio devi fare
tale regexp?
-- 
ZER0
~ .. six thousand and fifty two days, five hours, fifty eight minutes, forty three seconds.


 Per quale linguaggio devi fare tale regexp?
ASP (VBScript) e 
ASP.NET
 (
VB.NET
)

 ASP (VBScript) e 
ASP.NET
 (
VB.NET
)
ARGH. Ma perché volersi così male? :) ASP (classic) esprime le sue
potenzialità con JScript, più che con VBS; e su .NET C# è l'optimum.
Nel tuo caso continuo a consigliarti la funzione di callback, se possibile
(in js lo fai tranquillamente); altrimenti provo a buttare un'occhio alla
regexp appena ho tempo.
-- 
ZER0
~ .. six thousand and fifty two days, seven hours, one minutes, twenty three seconds.


 regexp appena ho tempo.
Attenzione che temo che ci sia qualcosina di diverso nella sintassi regexp
in vbscript...non chiedermi di più perché non le ho (ovviamente) mai usate
con vbscript ma ho un ricordo di ciò.
-- 
"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.

 dei tag!
e aggiungiamo i tag
var findWord =/(<*?[^<>]*?>+)|(\s*ciccio\w*\s*)/gi;
alert(tuoHTML.replace(findWord,'$1<b>$2</b>'));
Non è perfetta, ma sono curioso cosa sei riuscito a fare
te fin' ora, potresti postare il tuo codice ?

 te fin' ora, potresti postare il tuo codice ?
Scusa jeey ma non ho fatto questa richiesta per fare la "gara a chi cell'ha 
piu' lungo".
Io non ci sono riuscito e stop, per questo ho chiesto al newsgroup.
Se fossi riuscito a farlo non lo avrei chiesto.
Se fossi riuscito a farlo dopo averlo chiesto, lo avrei postato.
Non ho ancora provato la nuova RegExp che mi hai postato ora, ma se dici che 
non e' perfetta vuol dire che non fa quello che a me serve.
Ti ringrazio lo stesso e se dovessi riuscire e ti va di farmela avere senza 
"gare" ti ringrazio doppiamente.

 regexp appena ho tempo.
Magari, io non so proprio come farla! Grazie!

 Magari, io non so proprio come farla! Grazie!
Prova un po' questa:
s.replace(/(<[^>]*>[^<]*?)ciccio|ciccio/gi,"$1XXXX")
Non ho fatto grandi prove, l'ho provata al volo solo sul testo da te
postato.
-- 
ZER0
~ .. six thousand and fifty two days, eight hours, twenty nine minutes, thirty four seconds.


 in vbscript...
Mi pare solo nella costruzione dell'oggetto.. per il resto non dovrebbe
essere dissimile, visto che lo script engine è il medesimo. Ma non ci metto
assolutamente la mano sul fuoco, dato che VBS non lo uso credo da quasi
dieci anni.. quindi mi fido di ciò che dici, e rimango col dubbio anche io.
:)
-- 
ZER0
~ .. six thousand and fifty two days, eight hours, fifty eight minutes, thirty seconds.


 :)
Per curiosità se trovi discrepanze fai sapere. 
p.s. secondo me 10 anni fa non esisteva neanche l'oggetto regexp in
vbscript!


 vbscript!
Dal VBScript 5 in poi, credo sia dal 2000.

 postato.
Funziona non elaborando i tag che hanno sia apertura che chiusura <a></a> 
<span></span> ma non su quelli ad un solo tag <hr>
Ci sei quasi, io invece mi sono perso :) 

 non e' perfetta vuol dire che non fa quello che a me serve.
Non è porfetta per il solo motivo che aggiunge un tag <b></b> in più
il quale non disturba la visualizzazione della pagina.
e sinceramente ho tanto da fare se non hai la soluzione fino a stasera
quando vado a casa ci provo, qui in ufficio non posso dedicarci tanto tempo
by by

 Ci sei quasi, io invece mi sono perso :)
Ci sei e stop, mi sembra che funziona. Grazie! 

 tag nel mezzo (che poi era quello che scrivevo :P)
Mhm, no, dovrebbe funzionare anche in tale casistica. Ma magari non ho
capito cosa intendi, eventualmente scrivimi la stringa in questione che a
provarla non ci si mette nulla. :)
-- 
ZER0
~ .. six thousand and fifty two days, nine hours, forty four minutes, three seconds.


 Grazie!
De nada. Ti mando la parcella a casa? Ricordati che come valuta accetto
solo giovani fanciulle prosperose (non dico "vergini", perché sono
realista) :D
-- 
ZER0
~ .. six thousand and fifty two days, nine hours, forty four minutes, fifty seconds.


 realista) :D
schifoso... ROTFL !
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.

 realista) :D
mmmm fanciulle prosperose qui ne girano parecchie ormai... vivo al mare e 
con l'avanzare dell'estate non mancano. fai un salto qui e lancia la rete! 
:)

 tag nel mezzo (che poi era quello che scrivevo :P)
a me fallisce su questa stringa :-(
ciccio ciccione, cosi <a href="ciccio.asp" title="ciccionissimo">
ciccione</a> che dirgli <span class="ciccionone">ciccionissimo</span> non
basta <hr class="ciccionello" /></html>

 Ci ho preso? :-)
Adesso ho capito cosa intendevi. No, i "ciccio" li sostituisce anche se
successivi, e non "inframmezzati" da tag.
Il problema è che rieseguendo la regexp, anche sul testo originale, si è
verificata la sostituzione del class del tag di HR, cosa che nel mio test
iniziale non succedeva.
Quello di cui parlava visuddhi, per intenderci.
Il che mi fa sorgere il sospetto di aver copiato la regexp sbagliata, ma
non capisco - allora - perché poi visuddhi si è rimangiato la nota :)
-- 
ZER0
~ .. six thousand and fifty two days, ten hours, nineteen minutes, twenty seven seconds.


 esci male (ecco perche' dicevo di passare a splittare).
Se devi iniziare a scrivere codice, tanto vale usare la callback. Il punto
era risolvere la questione unicamente con la regexp.
-- 
ZER0
~ .. six thousand and fifty two days, ten hours, twenty eight minutes, forty three seconds.


 non capisco - allora - perché poi visuddhi si č rimangiato la nota :)
A me sembra funzioni, l'ho messa qui per le prove:
http://www.visuddhi.com/vstuff/regexpa.htm
 

"ZER0" ha scritto
 > Il punto era risolvere la questione unicamente con la regexp.
Anche perché callback, look-head e look-prima-o-come-si-dice :) non so 
nemmeno cosa siano!

 A me sembra funzioni, l'ho messa qui per le prove:
Perché hai un "ciccio" alla fine, dopo l'hr. :) Probabilmente anche io,
durante la scrittura della regexp, devo aver modificato il testo.. sarà per
quello che non mi sono accorto del problema di "hr".
-- 
ZER0
~ .. six thousand and fifty two days, ten hours, thirty one minutes, fifty nine seconds.


 quello che non mi sono accorto del problema di "hr".
Grrrrrr... lo risolviamo (risolvi)? :) 



In sostanza in JS hai la possibilità di associare una funzione al replace
tramite regexp. Ovvero, ogni volta che la regexp matcha la stringa, invoca
tale funzione e utilizza il valore di ritorno come testo da sostituire.
Nel tuo caso avresti qualcosa tipo:
var re=/(<[^>]*>)|(ciccio)/gi;
alert(s.replace(re,function(a,b){return b||"XX"}) );
-- 
ZER0
~ .. six thousand and fifty two days, ten hours, forty four minutes, thirty six seconds.


 nemmeno cosa siano!
In sostanza in JS hai la possibilità di associare una funzione al replace
tramite regexp. Ovvero, ogni volta che la regexp matcha la stringa, invoca
tale funzione e utilizza il valore di ritorno come testo da sostituire.
Nel tuo caso avresti qualcosa tipo:
var re=/(<[^>]*>)|(ciccio)/gi;
alert(s.replace(re,function(a,b){return b||"XX"}) );
E questo ti funziona in tutte le casistiche sopracitate :)
-- 
ZER0
~ .. six thousand and fifty two days, ten hours, forty four minutes, thirty
six seconds.


 Grrrrrr... lo risolviamo (risolvi)? :)
Altro giro, altra corsaaaa... prova un po' questa:
/ciccio(?![^<>]*>)/gi
-- 
ZER0
~ .. six thousand and fifty two days, eleven hours, eleven minutes, thirty nine seconds.


 /ciccio(?![^<>]*>)/gi
Ottimo
Forse chiedo troppo dato che diventerebbe una sorta di lezione vera e
propria ma, volendola "tradurre"?

 ma, volendola "tradurre"?
trovami "ciccio" a patto che NON sia seguito da zero o più caratteri
diversi da "<" e ">" che terminano con ">".
Se il codice di markup è scritto bene, l'unico caso in cui un "ciccio"
possa essere seguito da ">" senza incontrare prima un "<", è che sia fuori
da un tag.
Mi stupisco per non averci pensato prima, ed essere invece andato alla
ricerca di regexp arzigogolate.
Ma come ho scritto ieri, in quella giornata era possibile di tutto (anche
oggi per la verità, ma meno. Sto "assorbendo" il colpo.. della ex collega
che se né andata, intendo. ^_^)
-- 
ZER0
~ .. six thousand and fifty three days, three hours, fifteen minutes, fifty nine seconds.


 funziona; eventualmente mi riaggancio al thread. Di nuovo :)
Son qua, quando vuoi. :) Te nei prossimi giorni di "festa" che combini? Io
probabilmente scenderò a Firenze, magari ci scappa un saluto.
-- 
ZER0
~ .. six thousand and fifty three days, three hours, thirty eight minutes, twenty four seconds.


 E in questo caso che cosa viene espresso da b||"XXX" ?
Se "b" (il tag) è avvalorato, allora restituisce "b", altrimenti "XXX". Nel
nostro caso, solo se era stato trovato "ciccio" al posto di un tag, "b" non
sarebbe stato avvalorato.
-- 
ZER0
~ .. six thousand and fifty three days, three hours, forty minutes, forty five seconds.
