|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2005
Città: Roma
Messaggi: 1541
|
[JAVA] Eliminare "path/../" da URL
Ciao a tutti ragazzi,
sto scrivendo un metodo statico che, passandogli come parametro la stringa di un link, la restituisca senza "path/../" ovvero: http://www.hwupgrade.it/path/../index.html --> http://www.hwupgrade.it/index.html Per farlo avevo pensato sia a tokenizzare la stringa (split("/")) e sia alle espressioni regolari. Pensando di fare prima ho usate quest'ultime nel seguente modo: Codice:
public static String shrink(String link) { while(link.matches("^.*/[^\\s]+/\\.\\./.*$")) link.replaceAll("/[^\\s]+/\\.\\.", ""); return link; ![]() Avete qualche idea? Ciao
__________________
[ punkeroso ] - [ powered by Arch Linux ] |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Devi creare e restituire un nuovo oggetto String, dato che String è immutabile.
Ovvero il metodo replaceAll non modifica la stringa che gli passi come parametro, ma ne restituisce una nuova, che tu nel tuo metodo shrink non catturi e restituisci al chiamante; "link" non viene modificato. A parte questo, ma fare così non era più semplice? Codice:
public static void main(String... argv) { String link = "http://www.hwupgrade.it/path/../index.html"; System.out.println("Prima:"+link); String erase = "path/../"; String newLink = link.replace(erase, ""); System.out.println("Dopo:"+newLink); } Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 05-03-2010 alle 08:04. |
|
![]() |
![]() |
![]() |
#3 | ||
Senior Member
Iscritto dal: Jan 2005
Città: Roma
Messaggi: 1541
|
Quote:
Quote:
Ora, la mia espressione regolare è quasi giusta, ovvero, questa "/[\\w]+/\\.\\." fa quasi al caso mio, solamente che come path ammette solo caratteri alfanumerici, mentre un path può contenere caratteri come la tilde... Intanto ti ringrazio e spero che qualcuno mi dia una dritta con l'espressione regolare... Ciao
__________________
[ punkeroso ] - [ powered by Arch Linux ] |
||
![]() |
![]() |
![]() |
#4 | ||
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Se il "token" da cercare è uno solo, e a me par di capire che nel tuo caso lo sia, cioè è solo la stringa "path/../", allora puoi pure invocare replace, e tutte le occorrenze di quel token verranno sostituite con un'altra stringa che specifichi tu (quella vuota, in questo caso). Provare per credere ![]() P.S.: Quote:
![]() Aspe, ma tu devi cancellare le occorrenze della stringa esatta "path/../" o mi stai dicendo che tra "path/" e "../" può esserci altra roba ed è per questo che stai usando le regex? ![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 05-03-2010 alle 08:08. |
||
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Jan 2005
Città: Roma
Messaggi: 1541
|
Quote:
Spero di essermi spiegato! Ciao
__________________
[ punkeroso ] - [ powered by Arch Linux ] |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Non puoi cercare la terza occorrenza di "/" ?
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12840
|
Supponendo che la stringa dell'url sia ben formata:
Codice:
String iniziale = "http://www.test.com/a/b/../../index.html"; String finale = iniziale; boolean cont; do { cont = false; String intermedia = finale.replaceFirst("[A-z|0-9]*/\\.\\./", ""); if (!finale.equals(intermedia)) { finale = intermedia; cont = true; } } while (cont); System.out.println(finale); // http://www.test.com/index.html Questo perché nell'esempio che ho fatto "/a/b/../../" si vede che "b/../" rispetta la regular expression, quindi la successiva stringa dopo l'eliminazione viene: "/a/../" Ripetendo ancora ottieni "". Ho supposto che l'URL sia ben formato e che in mezzo potessi avere solo lettere e numeri, quindi prendi il codice con le pinze, probabimente si può fare di meglio. Edit: Versione ricorsiva Codice:
public static String shrink(String s) { return shrink(s, ""); } private static String shrink(String s1, String s2) { if (s1.equals(s2)) return s1; return shrink(s1.replaceFirst("[A-z|0-9]*/\\.\\./", ""), s1); } Ultima modifica di WarDuck : 06-03-2010 alle 15:43. |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jan 2005
Città: Roma
Messaggi: 1541
|
Grazie a tutti ragazzi,
io nel frattempo avevo risolto in questo modo: Codice:
public static String shrink(String link) { while(link.matches("^.*/[^ \t\n\f\r/]+/\\.\\./.*$")) link = link.replaceAll("/[^ \t\n\f\r/]+/\\.\\.", ""); return link; } Comunque grazie lo stesso Ciao
__________________
[ punkeroso ] - [ powered by Arch Linux ] |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12840
|
Si ho fatto una piccola modifica:
Codice:
public static String shrink(String s) { return shrink(s, ""); } private static String shrink(String s1, String s2) { if (s1.equals(s2)) return s1; return shrink(s1.replaceFirst("[^/]*/\\.\\./", ""), s1); } Codice:
"http://www.test.com/a/b-c/d%20e/f..g/../../../../index.html"; |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 14:14.