Regular Expression : Croce e delizia
In questi giorni ho dovuto fare un piccolo programma per fare il parsing di alcune pagine html un pò incasinate senza nessun tipo di standard e senza neanche usare gli id per indiviudare gli oggetti insomma da uscirne pazzi
Come prima cosa avevo pensato di navigare il DOM utilizzando l'oggetto com System.Mshtml che non è affatto male esempio
//Imposto il documento
IHTMLDocument2 doc = new HTMLDocumentClass();
string body = string.Empty;
using(System.IO.StreamReader reader =
new StreamReader(path,System.Text.Encoding.GetEncoding("iso-8859-1")))
{
body = reader.ReadToEnd();
doc.write(new object[]{body});
doc.close();
}
e poi per ciclare tra il dom basta fare un ciclo nella collection body
foreach(IHTMLElement el in (IHTMLElementCollection)doc.body.all)
{
}
e quindi tramite l'HTMLElement si possono recuperare e settare varie cose come, il testo gli attributi ecc.
Comodo ma non era proprio quello che cercavo anche perchè poi avevo diversi problemi nel riscrivere il file.
Quindi mi sono buttato sulle regular expression che sono molto molto potenti che permettono di recuperare tutto quello che volete.
Problema delle regular expression sono proprio le espressioni da creare che non sono semplicissime.
A questo punto ho chiesto aiuto al mago DAVID che mi ha aiutato moltissimo sia nel capire bene il funzionamento che nel creare delle espressioni ad hoc.
Esempio per recuperare i tag TH
MatchCollection arrayMatch = Regex.Matches(body,<TH(.?)*</TH>,RegexOptions.IgnoreCase);
foreach (Match match in arrayMatch)
{
}
L'espressioni dice Recuperami tutto il testo compreso nei tag e quindi verrà restituita una collection di stringhe(tramite il MatchCollection) che sarà tipo
<TH NOWRAP="1" ROWSPAN="2" WIDTH="11%" HEIGHT="60">Prova</TH>
e per recuperare solo la parola "Prova" si utilizza un altra regular expression e poi si utilizza il metodo replace della classe Regex
"Regex reg = new Regex("<(.|\n)*?>");"
result = reg.Replace(result,"");
Insomma questo post era in primis per ringraziare il mago e secondo per farvi capire la potenza delle reguar expression.
giovedì, 23 feb 2006 Ore. 12.59