检查String是否包含Java / Android中的URL的最佳方法是什么?最好的方法是检查字符串是否包含| .com | .net | .org | .info | .everythingelse |?或者有更好的方法吗?
网址是在Android中的EditText中输入的,它可以是粘贴的网址,也可以是手动输入的网址,用户不想输入http:// ...我正在处理网址缩短应用
答案 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将识别,更改外观并在字符串内的任何位置单击链接。
机器人:自动链接= “网络”