Android linkify URL 链接非 URL

Android linkify URLs links non URLs

我想让 textview 中的网页 links 可以点击。我使用了这个代码

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

它 link 验证网站 URL,但似乎随机 link 其他文本,如 z.xyz dzo.yzw 和其他。

如何让 linkify 只针对 link 个网址?为了尝试检测以 http:// 或 https:// 开头的 links 我尝试了这种模式编译

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

但这没有用(没有 link 被突出显示)。正则表达式正确吗? addLinks 的第三个参数应该是什么?

感谢您提供任何使此工作正常进行的提示。

你可以这样继续:

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);
}

More about URL regex: Regular expression to match URLs in Java

经过多次搜索和反复试验,这就是解决方案。不要使用默认值 Linkiny.WEB_URLS。使用查找 links 的自定义正则表达式模式。我使用了以下内容(et 是一个 EditText)。

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

这只会 link 化 URL 而不会像 Linkify.WEB_URLS 那样用句号分隔 2 个单词的其他字符串。

如果该正则表达式不足以满足您的需求,请参阅以下 link 以获取处理更复杂情况的大量经过测试的替代方案 https://mathiasbynens.be/demo/url-regex

希望对遇到同样问题的其他人有所帮助。

这是符合 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);

来自:.