Подтвердить что ты не робот

Какой лучший способ проверить, содержит ли String URL в Java/Android?

Какой лучший способ проверить, содержит ли String URL-адрес в Java/Android? Лучше всего было бы проверить, содержит ли строка |.com |.net |.org |.info |.everythingelse |? Или есть лучший способ сделать это?

URL-адрес введен в EditText в Android, это может быть вложенный URL-адрес, или это может быть введенный вручную URL-адрес, где пользователь не хочет печатать в http://... Я работаю над Сокращение URL-адресов.

4b9b3361

Ответ 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: Автоссылка = "паутина"