28

检查字符串是否包含 Java/Android 中的 URL 的最佳方法是什么?最好的方法是检查字符串是否包含 |.com | .net | .org | .info | .一切|?或者有更好的方法吗?

该 url 在 Android 中输入到 EditText 中,它可以是粘贴的 url,也可以是手动输入的 url,用户不想输入 http://... 我正在开发一个 URL 缩短应用程序.

4

11 回答 11

40

最好的方法是使用正则表达式,如下所示:

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");
}
于 2012-06-13T03:50:27.637 回答
10

这可以简单地通过构造函数周围的 try catch 来完成(无论哪种方式都是必要的)。

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();
于 2012-06-13T01:53:49.173 回答
7

环顾四周后,我试图通过删除 try-catch 块来改进 Zaid 的答案。此外,此解决方案在使用正则表达式时可识别更多模式。

所以,首先得到这个模式:

// 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}.,%_=?&#\\-+()\\[\\]\\*$~@!:/{};']*)",
    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 + " ");    
        }
    }
于 2015-02-22T02:54:52.047 回答
3

根据 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;
}
于 2016-10-18T15:27:09.767 回答
2

老问题,但发现了这个,所以我认为分享它可能很有用。应该对安卓有帮助...

于 2015-05-10T10:48:13.017 回答
1

我将首先使用 java.util.Scanner 在用户输入中查找候选 URL,使用一种非常愚蠢的模式,该模式会产生误报,但不会产生误报。然后,使用类似于@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();
    }
}
于 2012-06-13T01:53:07.067 回答
1

如果您不想尝试正则表达式并尝试测试方法,您可以使用 Apache Commons Library 并验证给定字符串是否为 URL/超链接。下面是示例。

请注意:此示例用于检测给定文本作为“整体”是否为 URL。对于可能包含常规文本和 URL 组合的文本,可能必须执行额外的步骤,即根据空格拆分字符串并循环遍历数组并验证每个数组项。

摇篮依赖:

implementation 'commons-validator:commons-validator:1.6'

代码:

import org.apache.commons.validator.routines.UrlValidator;

// Using the default constructor of UrlValidator class
public boolean URLValidator(String s) {
    UrlValidator urlValidator = new UrlValidator();
    return urlValidator.isValid(s);
}

// Passing a scheme set to the constructor
public boolean URLValidator(String s) {
    String[] schemes = {"http","https"}; // add 'ftp' is you need
    UrlValidator urlValidator = new UrlValidator(schemes);
    return urlValidator.isValid(s);
}

// Passing a Scheme set and set of Options to the constructor
public boolean URLValidator(String s) {
    String[] schemes = {"http","https"}; // add 'ftp' is you need. Providing no Scheme will validate for http, https and ftp
    long options = UrlValidator.ALLOW_ALL_SCHEMES + UrlValidator.ALLOW_2_SLASHES + UrlValidator.NO_FRAGMENTS;
    UrlValidator urlValidator = new UrlValidator(schemes, options);
    return urlValidator.isValid(s);
}

// Possible Options are:
// ALLOW_ALL_SCHEMES
// ALLOW_2_SLASHES
// NO_FRAGMENTS
// ALLOW_LOCAL_URLS

要使用多个选项,只需使用“+”运算符添加它们

如果您在使用 Apache Commons 库时需要在成绩中排除项目级别或传递依赖项,您可能需要执行以下操作(从列表中删除所需的任何内容):

implementation 'commons-validator:commons-validator:1.6' {
    exclude group: 'commons-logging'
    exclude group: 'commons-collections'
    exclude group: 'commons-digester'
    exclude group: 'commons-beanutils'
}

有关更多信息,该链接可能会提供一些详细信息。

http://commons.apache.org/proper/commons-validator/dependencies.html

于 2019-08-28T14:20:57.537 回答
0

您需要使用URLUtil isNetworkUrl(url)isValidUrl(url)

于 2020-04-30T19:52:21.177 回答
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);
    return m.find();
}

调用这个函数

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

注意:- 我已经测试了包含单个 url 的字符串

于 2017-08-10T07:29:43.223 回答
0
public boolean isURL(String text) {
    return text.length() > 3 && text.contains(".")
            && text.toCharArray()[text.length() - 1] != '.' && text.toCharArray()[text.length() - 2] != '.'
            && !text.contains(" ") && !text.contains("\n");
}
于 2021-01-01T10:53:26.710 回答
-2

最好的方法是将属性自动链接到您的文本视图,Android 将识别、更改外观并使可点击的链接成为字符串内的任何位置。

机器人:自动链接=“网络”

于 2016-05-19T08:36:34.127 回答