2015-11-03 151 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的实现在这里有点儿延伸,是不是?作者说它开始更简单,并且在测试中变得越来越复杂。还有一些人抱怨一些边缘案例。 –