Какой лучший способ проверить, содержит ли String URL в Java/Android?
Какой лучший способ проверить, содержит ли String URL-адрес в Java/Android? Лучше всего было бы проверить, содержит ли строка |.com |.net |.org |.info |.everythingelse |? Или есть лучший способ сделать это?
URL-адрес введен в EditText в Android, это может быть вложенный URL-адрес, или это может быть введенный вручную URL-адрес, где пользователь не хочет печатать в http://... Я работаю над Сокращение URL-адресов.
Ответы
Ответ 1
Лучший способ - использовать регулярное выражение, что-то вроде ниже:
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");
}
Ответ 2
Это просто делается с попыткой поймать конструктор (это необходимо в любом случае).
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();
Ответ 3
После осмотра я попытался улучшить ответ Zaid, удалив блок try-catch. Кроме того, это решение распознает больше шаблонов, поскольку оно использует регулярное выражение.
Итак, сначала получите этот шаблон:
// 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 a good url
System.out.print("<a href=\"" + item + "\">"+ item + "</a> " );
} else {
// it isn't a url
System.out.print(item + " ");
}
}
Ответ 4
Я бы сначала использовал 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();
}
}
Ответ 5
Старый вопрос, но нашел этот, поэтому я подумал, что может быть полезно поделиться. Должна помочь Android...
Ответ 6
На основании ответа 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;
}
Ответ 7
Эта функция работает для меня
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));
ПРИМЕЧАНИЕ. - Я проверил строку, содержащую единственный URL
Ответ 8
Если вы не хотите экспериментировать с регулярными выражениями и попробовать проверенный метод, вы можете использовать библиотеку Apache Commons и проверить, является ли данная строка URL/гиперссылкой или нет. Ниже приведен пример.
Обратите внимание: этот пример предназначен для определения, является ли данный текст как "целое" URL-адресом. Для текста, который может содержать комбинацию обычного текста наряду с URL-адресами, может потребоваться выполнить дополнительный шаг разбиения строки на основе пробелов и циклически проходить по массиву и проверять каждый элемент массива.
Зависимость Gradle:
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
Ответ 9
Лучше всего установить свойство autolink в текстовое представление, Android распознает, изменяет внешний вид и делает ссылку на клики в любом месте внутри строки.
Android: Автоссылка = "паутина"