Newsgroup: it.comp.lang.perl
Titolo: [newbie Regexp] Estrarre pezzo di HTML

Ciao a tutti,
sono un neo utente Perl e gia mi ha conquistato :)
Sto facendo uno script che estragga un perzzo di HTML da un file.
Ho usato l'epressione regolare:
<div calss="wiki">(.+?)</div>
sperando di estrarre tutto il contenuto compreso tra i due tag.
Ma non funziona :(
Riuscite a darmi qualche indizio su come correggere l'espressione?
Tks,
mat!
PS
L'elpressione regolare la prendo da STDIN, magari devo quatare qulache 
pezzo della regexp...

 <div calss="wiki">(.+?)</div>
"bene" che vada, e' class, calss...
ma comunque questo ti piglia qualunque cosa finisca per </div> (es: l'
html e'
BLABLABLA1
<div>
 BLABLABLA2
 <div class="wiki">Cio' che vuoi</div>
 BLABLABLA3
</div>
BLABLABLA4
quell' espressione regolare ti piglia pure "BLABLABLA3"
-- 
"Lo sa che io ho perduto due figli?"
"Signora, lei e' una donna piuttosto distratta"

 Sto facendo uno script che estragga un perzzo di HTML da un file.
[CUT]
Io ti consiglio di usare HTML::Parser.
(
http://search.cpan.org/~gaas/HTML-Parser-3.36/
)
Una regexp non può/riesce a fare il lavoro di un modulo, imho.
Ciao,
-- 
+--------+ | ASCII ribbon campaign ( ) | 
www.autistici.org/kral
|  kral  | |  - against HTML email  X  |
+--------+ |              & vCards / \ | my gpg id = 0x7C946947

 ma comunque questo ti piglia qualunque cosa finisca per </div>
Va bene perche' non ho <div> annidati. Il problema e' che non mi prende 
niente: mi restituice valore falso :(
mat!

 Una regexp non può/riesce a fare il lavoro di un modulo, imho.
Hai ragione ma ho scelto ler regexp perche' volevo rimanere in un ambito 
generale (elaborare anche file testo).
mat!

niente: mi restituice valore falso :(
Probabilmente perché devi usare il modificatore /s per trattare il
contenuto del file come un'unica riga.
Comunque
      <div calss="wiki">(.+?)</div>
non è un'espressione regolare: mancano i delimitatori (immagino che avrai
scritto qualcosa come:
     m|<div class="wiki">(.+)</div>|s
).
E non ci dici nulla su come tratti il file. E neppure fornisci un esempio
minimo di dati su cui l'espressione fallisce.
In queste condizioni, dire quale sia l'errore è un po' giocare a dadi.
Ciao.

 
falso. c'è giustamente il ? che indica a .+ di essere non-greedy, ossia 
cerca di "pigliare" il minimo indispensabile (eg si ferma al primo 
</div> che trova). quello che dici tu succederebbe senza il ?.
cheers,
Aldo

Pensavo a Aldo Calpini, quando lessi...

scusa, non avevo notato il "?"
a mia parziale discolpa e' che non fungerebbe lo stesso ;P
<div class="wiki">
 Cio' che vuoi
 <div>Questo lo piglia</div>
 ma questo no
</div>


Riuscite a darmi qualche indizio su come correggere l'espressione?
Se veramente non hai div annidati prova con:
/<div class="wiki">([^<]*)<\/div>/
'bye

 push <div class="wiki">(.+?)</div>
Scopro che mi restituisce correttamente:
  <h1>Questo e' un test</h1>
Quindi mi sono detto, lo script funziona.
Se uso il file (che e' un file ridotto di quelli che devo processare):
<html dir="ltr"><head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<style type="text/css">@import
url(
http://moodle.keilab.it/lib/editor/htmlarea.css)
;</style>
<title>INT2004: 1. Che cos'è Internet</title><meta name="keywords"
content="Moodle, INT2004: 1. Che cos'è Internet ">
<!-- End of header -->
<table class="generalbox" align="center" border="0" cellpadding="20"
cellspacing="0"><tbody><tr><td class="generalboxcontent"
bgcolor="#ffffff"><div class="wiki">
<p>
1. CHE COS'E' INTERNET
</p>
</div>
</td></tr></tbody></table><center><p><font size="1">Ultime modifiche:
Tuesday,  12 October 2004, 16:20</font></p></center></td>
<td background="1.1.view.php_files/left_sidebar.jpg" width="6"><img
src="1.1.view.php_files/left_sidebar.jpg" height="100%" width="6"></td>
</tr><tr>
<p align="center"> </p></body></html>
il programma mi risponde che non ha trovato nessun match mentre mi
aspetterei la stringa:
<p>
1. CHE COS'E' INTERNET
</p>
Quindi, mi sono detto, il mio script non funziona :(
Mi sto perdendo :(
Se serve posto anche lo script (sono 450 linee, però).
mat!

 /<div class="wiki">([^<]*)<\/div>/
Non va'. Ho spedito un'email con maggiori dettagli ma sembra non essere 
ancora arrivata. Aspetto un po' e poi riprovo...
mat!

...
Non ho purtroppo tempo in questo momento per leggere tutto con calma.
Da una prima scorsa, però, la mia prima supposizione sembra poter essere
fondata: prova ad usare:
    sub cmd_process
    {
         local $data;
         $data = tail_stack();
         if ($data =~ /$variables{'_regexp'}/s)
         # nota il modificatore              ^
         {
             push_stack( $1);
         }
         else
         {
             print "Ehi! No match.\n";
         }
    }
Le condizioni in cui lavora lo script sono comunque molto particolari e ci
potrebbe essere dell'altro (la necessità di quotare l'espressione, per
esempio).
Ciao.

 fondata: prova ad usare:
Azz! Che occhio! Hai fatto centro!
Grazie mille: adesso vado a rivedere bene il manuale di perl per capire 
/<regeexp>/s come funziona.
mat!