Regex в Java для фильтрации URL - PullRequest
1 голос
/ 02 февраля 2012

Я использую следующий фрагмент кода для преобразования гиперссылки в виде обычного текста в гиперссылку URL-адреса HTML.

message = message.replaceAll("(?:https?|ftps?|http?)://[\\w/%.\\-?&=]+",
        "<a href='$0' target='_blank'>$0</a>").replaceAll(
        "(www\\.)[\\w/%.\\-?&=]+", "<a href='http://$0' target='_blank'>$0</a>");

Но я заметил, что есть определенная комбинация URL, которая не будет успешно преобразована в гиперссылку html. Кто-нибудь может посоветовать, как улучшить коды для совпадений и в этих случаях?

enter image description here

Ответы [ 3 ]

1 голос
/ 02 февраля 2012

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

Вот код:

    String s="stackoverflow " +
            "http://naishe.blogspot.com " +
            "http://tw.com/#!/someTEXTs  " +
            "http://ts123t1.rapi.com/#!download|13321|1313|fairy_tale.mp4 " +
            "http://www.google.com/ " +
            "https://www.google.com/. " +
            "google.com " +
            "google.com, " +
            "google.com/test " +
            "123.com/test " +
            "ex-ample.com " +
            "http://ex-ample.com/test-url_chars?param1=val1&;par2=val+with%20spaces " +
            "something else";
    Pattern trimmer = Pattern.compile("(?:\\b(?:http|ftp|www\\.)\\S+\\b)|(?:\\b\\S+\\.com\\S*\\b)");
    Matcher m = trimmer.matcher(s);
    StringBuffer out = new StringBuffer();
    int i = 1;
    System.out.println(trimmer.toString());
    while(m.find()){
        System.out.println("|"+m.group()+"|");
    m.appendReplacement(out, "<a href=\""+m.group()+"\">URL"+ i++ +"</a>");
}
m.appendTail(out);
System.out.println(out+"!");

Вот результат

(?:\b(?:http|ftp|www\.)\S+\b)|(?:\b\S+\.com\S*\b)
|http://naishe.blogspot.com|
|http://tw.com/#!/someTEXTs|
|http://ts123t1.rapi.com/#!download|13321|1313|fairy_tale.mp4|
|http://www.google.com|
|https://www.google.com|
|google.com|
|google.com|
|google.com/test|
|123.com/test|
|ex-ample.com|
|http://ex-ample.com/test-url_chars?param1=val1&;par2=val+with%20spaces|

stackoverflow <a href="http://naishe.blogspot.com">URL1</a> 
<a href="http://tw.com/#!/someTEXTs">URL2</a>  
<a href="http://ts123t1.rapi.com/#!download|13321|1313|fairy_tale.mp4">URL3</a>
 <a href="http://www.google.com">URL4</a>/ 
<a href="https://www.google.com">URL5</a>/.
 <a href="google.com">URL6</a> <a href="google.com">URL7</a>,
 <a href="google.com/test">URL8</a> <a href="123.com/test">URL9</a>
 <a href="ex-ample.com">URL10</a>
 <a href="http://ex-ample.com/test-url_chars?param1=val1&;par2=val+with%20spaces">URL11</a> something else!

вы видите трейлинг /?:)

Дружественное предложение к OP: при предоставлении тестового примера, выберите формат, из которого мы можем скопировать.Нельзя копировать из JPEG в текстовый редактор.

0 голосов
/ 02 февраля 2012

Вот пример, который должен соответствовать любым URL:

String input = "http://rs43lt13.rapidshare.com/#!download|46311|44541812469|fairy_tgail_045_sd.mp4";
String re_url="((?:http|https)(?::\\/{2}[\\w]+)(?:[\\/|\\.]?)(?:[^\\s\"]*))";

Pattern url_pattern = Pattern.compile(re_url,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
Matcher matches = url_pattern.matcher(input);
if (m.find()) {
  System.out.print("Found URL!" + m.group(1));
}

Не забудьте предварительно импортировать java.util.regex. *.

0 голосов
/ 02 февраля 2012

URLEncoder.encode (String url, String encoding) должно помочь вам, нет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...