2012-06-13 13 views
14

Wie überprüft man am besten, ob ein String eine URL in Java/Android enthält? Am besten prüfen Sie, ob die Zeichenfolge | .com | enthält .net | .org | .info | .everythingelse | Oder gibt es einen besseren Weg?Wie überprüfe ich am besten, ob ein String eine URL in Java/Android enthält?

Die URL wird in einen EditText in Android eingegeben, es könnte eine eingefügte URL sein oder es könnte eine manuell eingegebene URL sein, wo der Benutzer nicht Lust hat in http: // ... einzugeben. Ich arbeite daran eine URL-Kürzungs-App

+0

Welche Art von URL erwarten Sie? Relative URL ist schwer zu erkennen. '/' Charakter ist eine Möglichkeit, aber neigt zu allgemeinen falsch positiven. – nhahtdh

+0

Wird es immer mit einem Protokoll beginnen? Kannst du einfach versuchen, es mit 'URL' zu parsen? –

+3

Viel Glück damit, sobald die neuen [GTLDs] (http://en.wikipedia.org/wiki/Generic_top-level_domain#New_top-level_domains) herauskommen;) –

Antwort

26

Der beste Weg wäre regulären Ausdruck zu verwenden, so etwas wie unten:

public static final String URL_REGEX = "^((https?|ftp)://|(www|ftp)\\.)?[a-z0-9-]+(\\.[a-z0-9-]+)+([/?].*)?$"; 

Pattern p = Pattern.compile(URL_REGEX); 
Matcher m = p.matcher("example.com");//replace with string to compare 
if(m.find()) { 
    System.out.println("String contains URL"); 
} 
+0

Gelöst! Genaueste und akzeptable Antwort! Vielen Dank! –

+1

das funktioniert nicht. Für Text 'hehe, überprüfen Sie diesen Link: http: // www.example.com /' m.find() gibt false zurück – lxknvlk

+0

Auch für jede Zeichenfolge als [a-z0-9.] [A-z0-9] es wird wahr zurückkommen. So wird "asdj.asdj" positiv sein – Tom

0

Ich würde zuerst java.util.Scanner verwenden, um Kandidaten-URLs in der Benutzereingabe zu finden, wobei ein sehr dummes Muster verwendet wird, das falsche positive Ergebnisse liefert, aber keine falschen negativen Ergebnisse. Verwenden Sie dann etwas wie die Antwort @ZedScio bereitgestellt, um sie zu filtern. Zum Beispiel

Pattern p = Pattern.compile("[^.]+[.][^.]+"); 
Scanner scanner = new Scanner("Hey Dave, I found this great site called blah.com you should visit it"); 
while (scanner.hasNext()) { 
    if (scanner.hasNext(p)) { 
     String possibleUrl = scanner.next(p); 
     if (!possibleUrl.contains("://")) { 
      possibleUrl = "http://" + possibleUrl; 
     } 

     try { 
      URL url = new URL(possibleUrl); 
      doSomethingWith(url); 
     } catch (MalformedURLException e) { 
      continue; 
     } 
    } else { 
     scanner.next(); 
    } 
} 
9

Dies ist einfach mit einem Versuch Catch um den Konstruktor getan (dies ist in beide Richtungen erforderlich).

String inputUrl = getInput(); 
if (!inputUrl.contains("http://")) 
    inputUrl = "http://" + inputUrl; 

URL url; 
try { 
    url = new URL(inputUrl); 
} catch (MalformedURLException e) { 
    Log.v("myApp", "bad url entered"); 
} 
if (url == null) 
    userEnteredBadUrl(); 
else 
    continue(); 
+2

Idk wie Java funktioniert, aber in .NET habe ich etwas ähnliches versucht. Diese Lösung scheint nicht robust zu sein. Wenn ich http: // an irgendetwas anfüge, wird ein gültiger URI für mich zurückgegeben. Vielleicht ist fast alles mit http: // vorne gültig. lol. – Mark13426

3

Nach umsah Ich habe versucht, durch Entfernen der try-catch-Block Zaids Antwort zu verbessern. Außerdem erkennt diese Lösung mehr Muster, da sie eine Regex verwendet.

Also, erstens dieses Muster erhalten:

// Pattern for recognizing a URL, based off RFC 3986 
private static final Pattern urlPattern = Pattern.compile(
    "(?:^|[\\W])((ht|f)tp(s?):\\/\\/|www\\.)" 
      + "(([\\w\\-]+\\.){1,}?([\\w\\-.~]+\\/?)*" 
      + "[\\p{Alnum}.,%_=?&#\\-+()\\[\\]\\*[email protected]!:/{};']*)", 
    Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 

Dann verwenden Sie diese Methode (unter der Annahme str ist Ihr string):

// separate input by spaces (URLs don't have spaces) 
    String [] parts = str.split("\\s+"); 

    // get every part 
    for(String item : parts) { 
     if(urlPattern.matcher(item).matches()) { 
      //it's a good url 
      System.out.print("<a href=\"" + item + "\">"+ item + "</a> ");     
     } else { 
      // it isn't a url 
      System.out.print(item + " ");  
     } 
    } 
+1

Das erkennt Link "example.com" nicht, aber die Idee, String für Space zu trennen und dann zu überprüfen, ist brilliant. Nur ein bisschen Regex Tweaking ist notwendig, um Perfektion zu erreichen. Edit: Statt der regex Sie zur Verfügung gestellt, kann man android.util.Patterns.WEB_URL wie folgt verwenden: 'android.util.Patterns.WEB_URL.matcher ("example.com") matches();' – lxknvlk

0

Alte Frage, fand aber this, so dachte ich, es könnte nützlich sein, um zu teilen. Sollte helfen für Android ...

-1

Der beste Weg ist, um die Eigenschaft Autolink auf Ihre Textansicht zu setzen, wird Android erkennen, ändern Sie das Aussehen und machen klickbar einen Link irgendwo innerhalb der Zeichenfolge.

android: Autolink = "web"

+0

. Sie haben eine andere Frage beantwortet, die Sie selbst gestellt haben – lxknvlk

0

Basierend auf EnKK Antwort, präsentiere ich meine Lösung:

public static boolean containsLink(String input) { 
    boolean result = false; 

    String[] parts = input.split("\\s+"); 

    for (String item : parts) { 
     if (android.util.Patterns.WEB_URL.matcher(item).matches()) { 
      result = true; 
      break; 
     } 
    } 

    return result; 
} 
0

Diese Funktion ist für mich arbeitet

private boolean containsURL(String content){ 
    String REGEX = "\\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"; 
    Pattern p = Pattern.compile(REGEX,Pattern.CASE_INSENSITIVE); 
    Matcher m = p.matcher(content); 
    if(m.find()) { 
     return true; 
    } 

    return false; 
} 

Rufen Sie diese Funktion

boolean isContain = containsURL("Pass your string here..."); 
Log.d("Result", String.valueOf(isContain)); 

HINWEIS: - Ich habe String getestet, der einzelne URL enthält

Verwandte Themen