2015-04-21 23 views
1

我在我的應用程序中使用Patterns.WEB_URL.matcher(str)來驗證應用程序中的URL。這個api在pre-Lollipop API中很有效。然而,在棒棒糖中它甚至驗證「abd.def」。奇怪和錯誤的行爲。任何建議/解決方案的想法?Patterns.WEB_URL.matcher錯誤行爲(str)

+1

我推薦閱讀:[爲什麼我避免android.util.Patterns(HTTP://博客。 danlew.net/2014/05/22/why-i-dont-use-patterns/)。 – Ziem

回答

5

奇怪的和錯誤行爲

使用固件出爐的正則表達式是由定義「馬車」。

頂級域名(TLD)列表一直在穩步擴大。任何試圖限制當時已知頂級域名的正則表達式最終都會過時。所以,12個月前,Google的工程師changed the regex to accept any TLD, so long as it uses the proper characters。另一種選擇是關於有效URL如何失敗正則表達式的一系列無盡的錯誤報告,當那些Android版本發佈時,這些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); 
相關問題