Newsgroup: it.comp.lang.perl
Titolo: HELP: cercare in una stringa una sottostringa...

Salve a tutti o voi esperti del Perl...
Ho un paio di quesiti che mi stanno tormentando la vita da un paio di
notti a questa parte,
dunque: come si fa a controllare che in una stringa ci sia una
sottostringa ???
La seguente riga non mi dava i risultati aspettati:
if ($paroladatrovare =~ /$stringa/gi) {
   print "parola trovata";
   }
else {
print "non trovata!";
 }
Se per esempio la parola da trovare e' "mamma" e nella stringa c'e' "il
mammalucco" non riusciro' a trovare nulla, ma se invece di "il
mammalucco" ci trovo "mam" allora lui la trova, anzi gli basta che ci
sia 1 sola lettera del nome che sila la "m" come la "a" per lui va bene,
se pero' prova c'e' un carattere non presente nella stringa da cercare
allora lui non mi trova nulla.
Come posso far si che mi trovi la parola completa ???
Il secondo quesito invece riguarda la sostituzione dei caratteri, vorei
sostituire delle parole in una stringa senza modificare i tag html che
essa contiene... 
Facendo:
$testo = "<font>on line</font>";
$trova = "on";
$cambia = "off";
$testo = s/$trova/$cambia/g;
mi ritrovo la stringa modificata in questo modo:
$testo = "<fofft>off line</fofft>";
E questo non mi va bene... non esiste un sistema per fargli ignorare i
tag e fargli modificare SOLO il testo presente tra i tag di
chiusura/apertura ?
Bene, dopo questi due problemoni non da poco (almeno per me) vi saluto
in attesa che qualche anima pia mi risponda.
--
Posted from 
alpha.interactiva.it
 [195.31.200.1]
via Mailgate.ORG Server - 
http://www.mailgate.org

$testo = s/$trova/$cambia/g;
prova con
$testo = s/\>(.*)($trova)([^\<])/>$1$cambia$2/g;
non l'ho provato ma dovrebbe andare.
Attento alle parentesi tonde e a quelle quadre.
Ciao
Andrea

 chiusura/apertura ?
Beh. La soluzione migliore richiede l'uso di qualcuno dei moduli HTML (se
ricordo bene HTML::Parser, ma non sono sicuro).
Un alternativa piu' becera e' scrivere una RE che faccia la sostituzione 
solo se la parola e' dentro un TAG.
Ed esempio, 
s/(<[^>]*>)$trova([^<>]*)(<[^>]*)/$1$cambia$2$3/g
sembra funzionare per il tuo esempio, ma in realta' va bene solo se 
entrambi i tag sono 'sulla stessa riga' e la parola da trovare c'e' solo
una volta tra i due tag. Come vedi, una soluzione alquanto becera.
Maurizio
-- 
Maurizio M. Munafo' / 
mmmu...@usa.net
"Consider Phlebas, who was once handsome and tall as you" (T.S.Eliot)

 allora lui non mi trova nulla.
Non m'immaginavo mai che perl era masculino :)
-w

 Non m'immaginavo mai che perl era masculino :)
L'ho dato di una personalita' sua, al maschile naturalmente. :-)
Ciao.
Michelangelo


 wrote:
:>Il secondo quesito invece riguarda la sostituzione dei caratteri, vorei
:>sostituire delle parole in una stringa senza modificare i tag html che
:>essa contiene... 
:>Facendo:
:>$testo = "<font>on line</font>";
:>$trova = "on";
:>$cambia = "off";
:>$testo = s/$trova/$cambia/g;
: prova con
: $testo = s/\>(.*)($trova)([^\<])/>$1$cambia$2/g;
: non l'ho provato ma dovrebbe andare.
  ^^^^^^^^^^^^^^^^
Si vede :-)
$testo =~ s/\>(.*)($trova)([^\<])/>$1$cambia$3/g;
Inoltre se in $testo hai una stringa del tipo "<p> <a href='mamma'> </p>"
la sostituzione cambia anche la "mamma" all'interno del tag "a".
Questo e` dovuto all'uso del "(.*)": basta che ci sia nella stessa
riga un carattere '>' e  la prima parte della RE e` soddisfatta.
Comunque in linea di principio non usate mai una semplice RE per
lavorare sull'HTML, presto o tardi verrete morsi. L'HTML e` cattivo e
speriamo che muoia presto, penso che l'XML abbia una sintassi un po'
meno schifosa.
Il modo migliore per procedere in questi casi e` quello di usare
HTML::Parser o HTML::Filter.
Basta costruire una sottoclasse di una di queste due classi e
ridefinire *una sola funzione*, la "text". Per maggiori informazione
consultare la man page, che e` sufficientemente chiara.
Per un uso piu` complesso di HTML::Filter guarda ad esempio:
http://www.ipers.net/~nandos/startrek.html
e` un programmino che preleva una pagina HTML e l'analizza.
-- 
Nando Santagata: Telemastica & infornatica
Key fingerprint = C2 D9 C0 8E D5 B7 04 97  AF E8 3F 3E AF 4E 7F 9E
finger nando (at) ipers (dot) net   for my PGP public key
Home: 
http://www.ipers.net/~nandos