2015-11-03 180 views
3

我想讓web瀏覽器在textview內點擊。我用這個代碼Android鏈接網址鏈接非網址

tv.setLinksClickable(true); 
tv.setAutoLinkMask(Linkify.WEB_URLS); 
Linkify.addLinks(tv, Linkify.WEB_URLS); 

這確實linkify網站網址,但也似乎隨機鏈接其他文字一樣z.xyz dzo.yzw等。

如何判斷鏈接到鏈接的URL?爲了嘗試和檢測以HTTP鏈接://或https://開頭我想這個模式編譯

tv.setLinksClickable(true); 
Pattern httpPattern = Pattern.compile("^(http|https)://"); 
Linkify.addLinks(tv, httpPattern,""); 

,但沒有工作(不鏈接被高亮顯示)。 RegEx是否正確? addLinks的第三個參數應該是什麼?

感謝您的任何提示,以獲得此工作。

回答

3

經過一番搜索和反覆試驗,這是解決方案。不要使用默認的Linkiny.WEB_URLS。使用查找鏈接的自定義正則表達式模式。我用了以下(et是一個EditText)。

et.setLinksClickable(true); 
Pattern httpPattern = Pattern.compile("[a-z]+:\\/\\/[^ \\n]*"); 
Linkify.addLinks(et, httpPattern,""); 

這隻會linkify網址,而不是其他字符串由句號分開2個字作爲Linkify.WEB_URLS可以做。

如果正則表達式是不夠好爲您的需要參閱以下鏈接測試的替代品的堆是處理更復雜的情況下 https://mathiasbynens.be/demo/url-regex

希望幫助別人有同樣的問題。對應於RFC 3986(URL標準)

0

你可以去這樣:

String regex = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"; 
if (tv.getText().toString().matches(regex)) { 
    tv.setLinksClickable(true); 
    Linkify.addLinks(tv, Linkify.WEB_URLS); 
} 

更多關於URL的正則表達式: Regular expression to match URLs in Java

+0

仍然突出顯示不以http開頭的字符串。例如「z.xy」突出顯示爲一個URL。正則表達式的確發現了https,但addLinks仍然會鏈接整個textView。 – Some1Else

+0

例如,嘗試「測試https://www.test.com測試https://www.blah.com test z.xy測試」作爲textView內容。只應該突出顯示2個URL,但也會將z.xy作爲URL加亮顯示。 Stackoverflow從該文本中刪除了https和http,但是URLS應該包含它們。 – Some1Else

+0

我不明白,我試過這個字符串 - >「z.xy」和'tv.getText()。toString()。matches(regex)'returned'false',和string - >「http://z.xy 「返回」true「。檢查你的代碼,在我的情況下,如果'工作正常。 – walkmn

3

Here'a S模式:

public static final Pattern URL_PATTERN = Pattern.compile(
     "(?:^|[\\W])((ht|f)tp(s?):\\/\\/|www\\.)" 
       + "(([\\w\\-]+\\.){1,}?([\\w\\-.~]+\\/?)*" 
       + "[\\p{Alnum}.,%_=?&#\\-+()\\[\\]\\*[email protected]!:/{};']*)", 
     Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 

從:https://stackoverflow.com/a/5713866/2980992

+0

說這是一個RFC的實現在這裏有點兒延伸,是不是?作者說它開始更簡單,並且在測試中變得越來越複雜。還有一些人抱怨一些邊緣案例。 –