检查String是否包含Java / Android中的URL的最佳方法是什么?

时间:2012-06-13 01:16:27

标签: java android string

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

网址是在Android中的EditText中输入的,它可以是粘贴的网址,也可以是手动输入的网址,用户不想输入http:// ...我正在处理网址缩短应用

10 个答案:

答案 0 :(得分:29)

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

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

答案 1 :(得分: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 :(得分:5)

环顾四周后,我尝试通过删除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 + " ");    
        }
    }

答案 3 :(得分: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();
    }
}

答案 4 :(得分: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;
}

答案 5 :(得分: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));

注意: - 我测试过包含单个网址的字符串

答案 6 :(得分:0)

如果您不想尝试使用正则表达式并尝试使用经过测试的方法,则可以使用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

答案 7 :(得分:0)

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

答案 8 :(得分: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");
}

答案 9 :(得分:-1)

最好的方法是将属性自动链接设置为您的textview,Android将识别,更改外观并在字符串内的任何位置单击链接。

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