2010-01-19 5 views
-3

Je veux faire un peu de manipulation avec les URLs.Manipulation d'URL

Il est nécessaire d'ajouter un sous-domaine dans l'URL déjà créé comme indiqué ci-dessous

Entrées

String inputURL = "http://www.myhost.com"; 
String subdomain = "newlocation"; 

sortie

String output = "http://www.newlocation.myhost.com"; 

Je pensais s'il y a une classe utilitaire existante peut le faire pour moi. l'expert peut avoir quelque chose à dire.

Merci pour votre aide!

+0

@Paul Tomblin, +1 et c'est dommage que vous n'ayez pas de représentant pour ça. –

+0

soulignant les règles du site n'est pas exactement digne de rep-mériter, mais c'est une bonne chose en général. – Bozho

+0

était plus la façon dont il a été dit. Je ris, puis soupirai. –

Répondre

5

Notez que "www" est également sous-domaine. Donc, vous êtes en train d'ajouter un autre sous-domaine.

String inputURL = "http://www.myhost.com"; 
    String subdomain = "newlocation"; 

    URL url = new URL(inputURL); 

    String[] domainParts = url.getHost().split("\\."); 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < domainParts.length; i ++) { 
     if (i == 1) { 
      sb.append(subdomain + "."); 
     } 
     sb.append(domainParts[i] + "."); 
    } 
    String query = ""; 
    String port = ""; 
    if (url.getQuery() != null) { 
     query = "?" + url.getQuery(); 
    } 
    if (url.getPort() != -1) { 
     port = url.getPort() + ""; 
    } 
    String output = url.getProtocol() + ":" + port + "//" + sb.toString() + "/" + url.getPath() + query; 
    System.out.println(output); 
+0

+1 pour utiliser la classe d'URL et ne pas réinventer la roue de l'analyseur d'URL –

+0

Cela ne signifie pas que je ne peux pas être meilleur (http://stackoverflow.com/questions/2093544/url-manipulation/2093990#2093990). :-) Avoir à rendre n'est pas agréable et votre code a un bug est va imprimer "http://www.newlocation.myhost.com./" –

+0

Oui cela fonctionne pour moi. Mais cet extrait de code fonctionne uniquement avec les URL avec "www". Si mon URL n'inclut pas "www", le sous-domaine est ajouté à la position 1; comme condition si pour la boucle. Je vais l'utiliser car mon URL viendra toujours avec www y compris. Encore une chose sb.append (domainParts [i] + "."); vous ne devez pas ajouter "." dans chaque sous-domaine car il est ajouté après ce 'com' aussi. D'ailleurs, j'ai changé cette méthode et je l'ai fait fonctionner. –

0

Regardez StringBuffer (Lien vers l'API Java doc) et vous aurez probablement besoin d'utiliser l'une des insert() méthodes

+0

bien amit; Cela peut faire et j'ai pensé à cela aussi. Mais je cherchais une classe d'utilité d'URL pour l'aide hors de la boîte. Pensez maintenant à une situation où il n'y a pas www dans l'URL. Alors me suggérez-vous de vérifier cela comme un cas particulier? Désolé! Non! Je ne penserai pas à le faire. tant qu'il n'y a pas d'autre option élégante. :) –

+0

Quelle solution élégante cherchez-vous? Ecrivez vous-même un cours Java et mettez-le en place pour que les autres puissent en bénéficier et le vôtre aussi. Ce sera élégant :) –

+0

Oui Amit; Ce sera bien et je fais déjà mon plan pour le faire. –

2

Peut-être:

String output = inputURL.replaceAll("(http://[^.]+\\.)(.*)", "$1" + subdomain + ".$2"); 
+0

Modifié afin qu'il corresponde au premier élément de n'importe quelle URL, pas seulement www. –

+0

Je ne sais pas ce que vous avez fait Dean! Mais c'est magique. Merci votre réponse. J'apprendrai ces notations et je l'utiliserai dans d'autres situations. –

3

Il suffit d'analyser uniquement la partie hôte de l'URL et d'utiliser l'URI pour effectuer le rendu.

URL url = new URL(inputURL); 
String host = url.getHost().replaceAll("(([.][^.]+){2,2})$", "." + subdomain + "$1"); 
String newUrl = new URI(url.getProtocol(), host, url.getPath(), url.getQuery(), null).toString();