我想在textview中点击可以进行网页链接。我用过这段代码
tv.setLinksClickable(true);
tv.setAutoLinkMask(Linkify.WEB_URLS);
Linkify.addLinks(tv, Linkify.WEB_URLS);
链接网站网址,但似乎也随机链接其他文字,如z.xyz dzo.yzw和其他人。
如何将linkify告知仅链接网址?要尝试检测以http://或https://开头的链接,我尝试使用此模式编译
tv.setLinksClickable(true);
Pattern httpPattern = Pattern.compile("^(http|https)://");
Linkify.addLinks(tv, httpPattern,"");
但是没有用(没有突出显示链接)。 RegEx是否正确? addLinks的第3个参数应该是什么?
感谢您提供有关此功能的任何提示。
答案 0 :(得分:4)
这是与RFC 3986(URL标准)对应的模式:
public static final Pattern URL_PATTERN = Pattern.compile(
"(?:^|[\\W])((ht|f)tp(s?):\\/\\/|www\\.)"
+ "(([\\w\\-]+\\.){1,}?([\\w\\-.~]+\\/?)*"
+ "[\\p{Alnum}.,%_=?&#\\-+()\\[\\]\\*$~@!:/{};']*)",
Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
答案 1 :(得分:3)
经过大量搜索和反复试验,这就是解决方案。不要使用默认的Linkiny.WEB_URLS。使用查找链接的自定义正则表达式模式。我使用了以下内容(et是一个EditText)。
et.setLinksClickable(true);
Pattern httpPattern = Pattern.compile("[a-z]+:\\/\\/[^ \\n]*");
Linkify.addLinks(et, httpPattern,"");
这只会链接网址而不是其他字符串,其中2个字以句号分隔,如Linkify.WEB_URLS所能做的那样。
如果正则表达式不能满足您的需求,请参阅以下链接,了解处理更复杂案例的大量经过测试的替代方案 https://mathiasbynens.be/demo/url-regex
希望能帮助其他人解决同样的问题。
答案 2 :(得分: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