2012-06-13 39 views
14

Cách tốt nhất để kiểm tra xem Chuỗi có chứa URL trong Java/Android không? Cách tốt nhất là kiểm tra xem chuỗi có chứa | .com | .net | .org | .info | .everythingelse |? Hoặc có cách nào tốt hơn để làm điều đó?Cách tốt nhất để kiểm tra xem Chuỗi có chứa URL trong Java/Android không?

Url được nhập vào EditText trong Android, có thể là url được dán hoặc đó có thể là url được nhập thủ công mà người dùng không cảm thấy thích nhập http: // ... Tôi đang làm việc một ứng dụng rút ngắn URL.

+0

Bạn mong đợi loại URL nào? URL tương đối khó phát hiện. Ký tự '/' là một cách, nhưng có xu hướng chung là dương tính giả. – nhahtdh

+0

Nó sẽ luôn bắt đầu với một giao thức? Bạn có thể thử phân tích cú pháp bằng 'URL' không? –

+3

Chúc may mắn với điều này khi [GTLD] mới (http://en.wikipedia.org/wiki/Generic_top-level_domain#New_top-level_domains) xuất hiện;) –

Trả lời

26

Cách tốt nhất là nên sử dụng biểu thức chính quy, một cái gì đó như dưới đây:

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

GIẢI PHÁP! Câu trả lời chính xác nhất và chấp nhận được! Cảm ơn bạn! –

+1

tính năng này không hoạt động. Đối với văn bản 'hehe, hãy kiểm tra liên kết này: http: // www.example.com /' m.find() trả về false – lxknvlk

+0

Ngoài ra đối với bất kỳ chuỗi nào là [a-z0-9.] [A-z0-9] nó sẽ trở lại đúng sự thật. Vì vậy, "asdj.asdj" sẽ được tích cực – Tom

0

Trước tiên, tôi sẽ sử dụng java.util.Scanner để tìm URL ứng viên trong đầu vào của người dùng bằng cách sử dụng mẫu rất câm sẽ mang lại kết quả dương tính giả, nhưng không có âm bản sai. Sau đó, sử dụng một cái gì đó giống như câu trả lời @ZedScio được cung cấp để lọc chúng xuống. Ví dụ:

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

Điều này chỉ đơn giản là được thực hiện với một thử bắt xung quanh hàm tạo (điều này là cần thiết theo một trong hai cách).

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

Làm thế nào Java hoạt động, nhưng trong .NET tôi đã thử một cái gì đó tương tự. Giải pháp này không có vẻ mạnh mẽ. Đính kèm http: // vào bất kỳ thứ gì trả về một URI hợp lệ cho tôi. Có lẽ hầu hết mọi thứ với http: // ở phía trước đều hợp lệ. lol. – Mark13426

3

Sau khi nhìn xung quanh tôi đã cố gắng để cải thiện câu trả lời Zaid bằng cách loại bỏ các khối try-catch. Ngoài ra, giải pháp này nhận ra nhiều mẫu hơn khi sử dụng regex.

Vì vậy, trước hết là có được mô hình này:

// 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); 

Sau đó, sử dụng phương pháp này (giả str được chuỗi của bạn):

// 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

Điều này không nhận ra liên kết "example.com", nhưng ý tưởng tách chuỗi theo không gian và sau đó kiểm tra là rực rỡ. Chỉ cần một chút chỉnh sửa regex là cần thiết để đạt được sự hoàn hảo. Chỉnh sửa: Thay vì regex bạn đã cung cấp, bạn có thể sử dụng android.util.Patterns.WEB_URL như sau: 'android.util.Patterns.WEB_URL.matcher (" example.com "). Matches();' – lxknvlk

0

Cũ câu hỏi, nhưng không tìm thấy this, vì vậy tôi nghĩ rằng nó có thể có ích để chia sẻ. Nên trợ giúp cho Android ...

-1

Cách tốt nhất là đặt tự động liên kết thuộc tính thành chế độ xem văn bản của bạn, Android sẽ nhận dạng, thay đổi giao diện và nhấp vào liên kết ở bất kỳ đâu bên trong chuỗi.

android: Tự động liên kết = "web"

+0

bạn đã trả lời một số câu hỏi khác mà bạn đã tự tạo – lxknvlk

0

Dựa trên câu trả lời Enkk của, tôi trình bày giải pháp của tôi:

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

Chức năng này đang làm việc cho tôi

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; 
} 

Gọi chức năng này

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

LƯU Ý: - Tôi đã thử nghiệm chuỗi chứa url duy nhất

Các vấn đề liên quan