2015-04-21 4 views
1

Я использовал Patterns.WEB_URL.matcher(str) в своем приложении для проверки URL-адресов в своем приложении. Этот api отлично работает в API до Lollipop. Однако в Lollipop он проверяет даже «abd.def». Странное и плохое поведение. Любые предложения/идеи исправления?Неправильное поведение шаблонов.WEB_URL.matcher (str)

+1

Я рекомендую прочитать: [Почему я избегаю android.util.Patterns] (Http: // блога. danlew.net/2014/05/22/why-i-dont-use-patterns/). – Ziem

ответ

5

Странное и багги поведение

Использование встроенного запеченного регулярного выражения по определению «багги».

Список доменов верхнего уровня (TLD) неуклонно расширяется. Любое регулярное выражение, которое пытается ограничить известные TLD в это время, в конечном итоге станет устаревшим. Итак, 12 месяцев назад инженеры Google changed the regex to accept any TLD, so long as it uses the proper characters. Альтернативой является бесконечная серия отчетов об ошибках о том, как допустимые URL-адреса вызывают повторное выражение, когда эти URL-адреса были бы недействительными, если эта версия Android будет отправлена.

Любые предложения/идеи об исправлении?

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

IOW, сделайте то, что не зависит от прошивки, и убедитесь, что вы поддерживаете его в точном соответствии с изменениями в действительных TLD.

1

Чтобы расширить на ответ CommonsWare, вот что я использую, чтобы избежать Linkify связь, казалось бы, случайный текст:

Linkify.TransformFilter filter = new Linkify.TransformFilter() { 
     public final String transformUrl(final Matcher match, String url) { 
      return match.group(); 
     } 
    }; 

    Pattern webURL = Pattern.compile(new StringBuilder() 
        .append("((?:(http|https|Http|Https|rtsp|Rtsp):") 
        .append("\\/\\/(?:(?:[a-zA-Z0-9\\$\\-\\_\\.\\+\\!\\*\\'\\(\\)") 
        .append("\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,64}(?:\\:(?:[a-zA-Z0-9\\$\\-\\_") 
        .append("\\.\\+\\!\\*\\'\\(\\)\\,\\;\\?\\&\\=]|(?:\\%[a-fA-F0-9]{2})){1,25})?\\@)?)?") 
        .append("((?:(?:[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}\\.)+") // named host 
        .append("(?:") // plus top level domain 
        .append("(?:aero|arpa|asia|a[cdefgilmnoqrstuwxz])") 
        .append("|(?:biz|b[abdefghijmnorstvwyz])") 
        .append("|(?:cat|com|coop|c[acdfghiklmnoruvxyz])") 
        .append("|d[ejkmoz]") 
        .append("|(?:edu|e[cegrstu])") 
        .append("|f[ijkmor]") 
        .append("|(?:gov|g[abdefghilmnpqrstuwy])") 
        .append("|h[kmnrtu]") 
        .append("|(?:info|int|i[delmnoqrst])") 
        .append("|(?:jobs|j[emop])") 
        .append("|k[eghimnrwyz]") 
        .append("|l[abcikrstuvy]") 
        .append("|(?:mil|mobi|museum|m[acdghklmnopqrstuvwxyz])") 
        .append("|(?:name|net|n[acefgilopruz])") 
        .append("|(?:org|om)") 
        .append("|(?:pro|p[aefghklmnrstwy])") 
        .append("|qa") 
        .append("|r[eouw]") 
        .append("|s[abcdeghijklmnortuvyz]") 
        .append("|(?:tel|travel|t[cdfghjklmnoprtvwz])") 
        .append("|u[agkmsyz]") 
        .append("|v[aceginu]") 
        .append("|w[fs]") 
        .append("|y[etu]") 
        .append("|z[amw]))") 
        .append("|(?:(?:25[0-5]|2[0-4]") // or ip address 
        .append("[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(?:25[0-5]|2[0-4][0-9]") 
        .append("|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1]") 
        .append("[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(?:25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}") 
        .append("|[1-9][0-9]|[0-9])))") 
        .append("(?:\\:\\d{1,5})?)") // plus option port number 
        .append("(\\/(?:(?:[a-zA-Z0-9\\;\\/\\?\\:\\@\\&\\=\\#\\~") // plus option query params 
        .append("\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])|(?:\\%[a-fA-F0-9]{2}))*)?") 
        .append("(?:\\b|$)").toString() 
    ); 

    Linkify.addLinks(myTextView, webURL, null, null, filter); 
Смежные вопросы