2012-06-13 14 views
14

यह जांचने का सबसे अच्छा तरीका क्या है कि स्ट्रिंग में जावा/एंड्रॉइड में एक यूआरएल है या नहीं? यह जांचने का सबसे अच्छा तरीका होगा कि स्ट्रिंग में | .com | है .NET | .org | .info | .everythingelse |? या क्या ऐसा करने का एक बेहतर तरीका है?यह जांचने का सबसे अच्छा तरीका क्या है कि स्ट्रिंग में जावा/एंड्रॉइड में एक यूआरएल है या नहीं?

यूआरएल एंड्रॉइड में एडिटटेक्स्ट में प्रवेश किया गया है, यह एक चिपकाया यूआरएल हो सकता है या यह मैन्युअल रूप से यूआरएल दर्ज किया जा सकता है जहां उपयोगकर्ता http: // में टाइपिंग नहीं कर रहा है ... मैं काम कर रहा हूं एक यूआरएल छोटा करने वाला ऐप।

+0

आप किस प्रकार के यूआरएल की अपेक्षा करते हैं? सापेक्ष यूआरएल का पता लगाना मुश्किल है। '/' चरित्र एक तरीका है, लेकिन सामान्य झूठी सकारात्मक में आता है। – nhahtdh

+0

क्या यह हमेशा प्रोटोकॉल से शुरू होगा? क्या आप इसे 'यूआरएल' के साथ पार्स करने का प्रयास कर सकते हैं? –

+3

एक बार नया [जीटीएलडी] (http://en.wikipedia.org/wiki/Generic_top-level_domain#New_top-level_domains) बाहर आने के साथ शुभकामनाएं;) –

उत्तर

26

सबसे अच्छा तरीका नीचे की तरह नियमित अभिव्यक्ति, कुछ का उपयोग करने के होगा:

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

हल हो गया! सबसे सटीक और स्वीकार्य उत्तर! धन्यवाद! –

+1

यह काम नहीं करता है। टेक्स्ट के लिए 'हेहे, इस लिंक को जांचें: http: // www.example.com/'m.find() झूठी – lxknvlk

+0

किसी भी स्ट्रिंग के लिए [a-z0-9।] [A-z0-9] यह सच हो जाएगा। तो "asdj.asdj" सकारात्मक होगा – Tom

0

मैं पहले उपयोगकर्ता इनपुट में उम्मीदवार यूआरएल खोजने के लिए java.util.Scanner का उपयोग करता हूं जो बहुत ही गूढ़ पैटर्न का उपयोग करता है जो झूठी सकारात्मक उत्पन्न करेगा, लेकिन कोई झूठी नकारात्मक नहीं होगी। फिर, उन्हें नीचे फ़िल्टर करने के लिए दिए गए उत्तर @ZedScio जैसे कुछ का उपयोग करें। उदाहरण के लिए,

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

यह केवल निर्माता चारों ओर एक कोशिश पकड़ के साथ किया जाता है (यह आवश्यक किसी भी तरह से है)।

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

आईडीके अपडेट किया है कि जावा कैसे काम करता है, लेकिन .NET में मैंने कुछ ऐसा करने की कोशिश की। यह समाधान मजबूत प्रतीत नहीं होता है। Http: // को संलग्न करने से मेरे लिए एक वैध यूआरआई लौटाता है। शायद http: // के साथ लगभग कुछ भी मान्य है। जबरदस्त हंसी। – Mark13426

3

चारों ओर देखने के बाद मैं कोशिश कैच ब्लॉक को हटाने के द्वारा ज़ैद के जवाब में सुधार करने की कोशिश की। साथ ही, यह समाधान अधिक पैटर्न को पहचानता है क्योंकि यह रेगेक्स का उपयोग करता है।

तो, सबसे पहले इस पैटर्न मिलती है:

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

फिर, इस विधि का उपयोग (str मान रहा है अपने स्ट्रिंग):

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

यह लिंक "example.com" को नहीं पहचानता है, लेकिन अंतरिक्ष द्वारा स्ट्रिंग को स्ट्रिंग करने का विचार और फिर जांच शानदार है। पूर्णता तक पहुंचने के लिए बस थोड़ा सा रेगेक्स ट्वीकिंग की आवश्यकता है। संपादित करें: regex आपके द्वारा दी गई करने के बजाय, एक android.util.Patterns.WEB_URL इस तरह उपयोग कर सकते हैं: 'android.util.Patterns.WEB_URL.matcher (" example.com ") मैचों();' – lxknvlk

0

पुराना सवाल है, लेकिन this पाया है, तो मैंने सोचा कि यह हो सकता है साझा करने के लिए उपयोगी हो। एंड्रॉइड के लिए मदद चाहिए ...

-1

संपत्ति को अपने टेक्स्टव्यू पर ऑटोलिंक सेट करने का सबसे अच्छा तरीका है, एंड्रॉइड पहचान लेगा, उपस्थिति को बदल देगा और स्ट्रिंग के अंदर कहीं भी एक लिंक क्लिक करने योग्य होगा।

एंड्रॉयड: autoLink = "वेब"

+0

। आपने कुछ अन्य प्रश्नों का उत्तर दिया है कि आपने स्वयं को बनाया है – lxknvlk

0

Enkk के जवाब के आधार पर, मैं अपने समाधान प्रस्तुत:

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

इस समारोह मेरे लिए काम कर रहा है

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

कॉल इस समारोह

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

नोट: - मैंने स्ट्रिंग का परीक्षण किया है जिसमें एकल यूआरएल

संबंधित मुद्दे

 संबंधित मुद्दे