Salve a tutti ...
Stavo cercando di scrivere un client http personalizzato che svolga determinate funzioni.
Avevo bisogno di estrarre da una pagina html determinati valori.
Volevo consultarmi con voi ed in particolare con andbin se ci sono metodi più efficaci o cmq più eleganti per fare ciò visto che io non riesco attualmente ad usare al meglio le regex.
Sono convito che si può fare di più.
Per capirci ho una classe con un metodo statico di questo tipo :
Codice PHP:
public class Regex
{
private static java.util.regex.Pattern p;
private static java.util.regex.Matcher m;
public static String singleRegex(String regex,String html)
{
p = java.util.regex.Pattern.compile(regex, java.util.regex.Pattern.CASE_INSENSITIVE);
m = p.matcher(html);
String tmp = "";
if(m.find())
{
tmp += html.substring(m.start(), m.end());
}
return tmp;
}
Però ovviamente questo metodi si ferma alla prima occorrenza.
Facciamo un esempio. Io in questa pagina html ho un insieme di chiavi di questo tipo : variabile="valore";
devo estrarre tutte questa coppia di variabili="valore" e poi eliminare gli apici ...
Purtroppo con questo metodo riesco a restituire solo una String e fermarmi alla prima occorrenza che trovo.
Per prendere il resto di coppie variabile=valore nel resto della pagina nel metodo chiamante continuavo con una serie di indexof etc.
Ecco un esempio di cosa combino ... :
Codice PHP:
private void instantiateOtherVillages(String html) {
Village v;
html = Regex.singleRegex("<table cellpadding=\"1\" cellspacing=\"1\" id=\"vlist\"><thead>.*?</table>", html);
int startIndex = 0;
int endIndex = 0;
String link = "";
String name = "";
int x = 0;
int y = 0;
while( (startIndex = html.indexOf("<a href=\"?newdid=")) != -1) {
link = getInputLinkVillage(html); System.out.println(link);
name = getInputNameVillage(html); System.out.println(name);
x = getInputCoordinateX(html); System.out.println(x);
y = getInputCoordinateY(html); System.out.println(y);
v = new Village(link,name,new Coordinate(x,y)); collectionVillages.add(v);
endIndex = html.indexOf("</tr>",startIndex);
html = html.substring(endIndex);
}
return;
}
/*utility*/
private String getInputLinkVillage(String html) {
String link = "";
link = Regex.singleRegex("\\?newdid=.*?\"", html);
link = link.replaceAll("\"", ""); return link;
}
//seguono altri metodi simili a getInputLinkVillage()
//insomma sono metdi per andare a pescare un valore alla volta...
Un metodo mi ritorna il valore della x,
un metodo il valore della y
che sono delle coordinate dove si trova un villaggio .
Un metodo mi ritorna il nome del villaggio e un metodo il link/url.
Ovviamente il tutto risulta molto pesante ed ingestibile ....
Secondo me c'è pur un modo con le regex per trovare più cose contemporaneamente.... In che modo posso farlo ?
Ad esempio trovare le coordinate X e Y sono due metodi praticamente identici, cambia la posizone in cui sono scritti nell'html per questo procedo in questo modo ... Idee?
C'è qualche modo più elegante ed efficace ?
Grazie