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

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

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

 Dave Newton13 июн. 2012 г., 03:18
Будет ли это всегда начинаться с протокола? Вы можете просто попытаться разобрать это сURL?
 William L.13 июн. 2012 г., 03:39
Все, что заканчивается на .com или. Что-либо, что не обязательно должно иметь http: // в начале. @Squonk Я обновил свой ответ
 nhahtdh13 июн. 2012 г., 03:18
Какой URL вы ожидаете? Относительный URL трудно обнаружить./ характер односторонний, но имеет тенденцию к общему ложному позитиву.
 Squonk13 июн. 2012 г., 03:29
@WilliamL. Вы действительно не предоставляете достаточно информации. Когда вы говорите «если строка содержит URL-адрес», как насчет ... «Эй, Дейв, я обнаружил, что этот замечательный сайт называется blah.com, вам стоит посетить его»? Я имею в виду, откуда твои струны?blah.com в этом случае может быть действительный URL, но вы анализируете какой-либо общий текст или ... ну, что угодно. Ваш вопрос довольно расплывчатый. Как Дэйв Ньютон предлагаетURL class (и URI class) `можно использовать для разбора.
 Brendan Long13 июн. 2012 г., 03:28
Удачи с этим когда-то новымGTLDs публично заявить ;)

Ответы на вопрос(8)

я попытался улучшить ответ Заида, убрав блок 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's a good url
            System.out.print("<a href=\"" + item + "\">"+ item + "</a> " );                
        } else {
           // it isn't a url
            System.out.print(item + " ");    
        }
    }
 18 окт. 2016 г., 17:10
Это не распознает ссылку "example.com", но идея разбить строку по пробелу и затем проверить блестящую. Для достижения совершенства требуется лишь небольшая настройка регулярных выражений. Изменить: Вместо предоставленного вами регулярного выражения можно использовать android.util.Patterns.WEB_URL, например:android.util.Patterns.WEB_URL.matcher("example.com").matches();

чтобы установить свойство autolink для вашего текстового представления, Android распознает, изменит внешний вид и сделает кликабельной ссылку в любом месте строки.

Android: Автоссылка = & Quot; веб & Quot;

 18 окт. 2016 г., 17:00
ты ответил на другой вопрос, который сам придумал
Решение Вопроса

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");
}
 18 окт. 2016 г., 17:06
это не работает. Для текстаhehe, check this link: http://www.example.com/ m.find () возвращает false
 11 окт. 2014 г., 13:10
РЕШИТЬ! Самый точный и приемлемый ответ! Спасибо!
 16 авг. 2017 г., 09:42
Также для любой строки как [a-z0-9.] [A-z0-9] она вернет true. Итак, "asdj.asdj" будет положительным
 19 окт. 2018 г., 10:10
Не работает вообще.

одимо в любом случае).

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();
 30 янв. 2016 г., 04:07
ИДК, как работает Java, но в .NET я попробовал нечто подобное. Это решение не кажется надежным. Присоединение http: // к чему-либо возвращает мне действительный URI. Возможно, почти все, что с http: // впереди, действительно. лол.

чтобы найти 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();
    }
}
 01 мар. 2019 г., 14:12
Я думаю, что это то, что я хочу, но это работает для всех URL? включая файл и ftp! позвольте мне проверить, как это работает. в любом случае спасибо.

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

этотЯ подумал, что это может быть полезно поделиться. Должно помочь для Android ...

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

 04 мар. 2019 г., 15:18
если вы отметите половину URL как & quot;stackoverf& Quot; Тем не менее он возвращает истину

Ваш ответ на вопрос