安卓中的链接化:URL链接和非URL链接

4

我想让TextView中的网页链接可点击。我使用了以下代码:

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

它确实可以将网站URL链接化,但似乎还会随意链接其他文本,例如z.xyz、dzo.yzw等。

我该如何告诉链接化程序只链接URL?为了尝试检测以http://或https://开头的链接,我尝试了编译以下模式:

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

但是它没有起作用(没有链接被突出显示)。那个正则表达式正确吗?将addLinks的第三个参数设置为什么?感谢任何帮助让它工作的提示。
3个回答

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

来源:https://dev59.com/tG025IYBdhLWcg3w7qjL#5713866


这是一段关于IT技术的内容。

说这是RFC的实现有些牵强,对吧?作者说它开始简单,并且通过测试变得更加复杂。但仍有一些人抱怨某些边缘情况。 - Dielson Sales

4
经过许多搜索和尝试,这是解决方案。不要使用默认的Linkiny.WEB_URLS。使用自定义的正则表达式模式查找链接。我使用了以下代码(et为EditText)。
et.setLinksClickable(true);
Pattern httpPattern = Pattern.compile("[a-z]+:\\/\\/[^ \\n]*");
Linkify.addLinks(et, httpPattern,"");

这将只链接化URL,而不像Linkify.WEB_URLS可以做的那样连接其他由一个句点分隔的2个单词的字符串。

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

希望这能帮助有相同问题的人。


给定的正则表达式和默认自动链接在我的Android 5和6上工作不正常。它会将实际链接后面的下一个单词包含到链接中。 - YTerle

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正则表达式的内容: Java中用于匹配URL的正则表达式

仍然突出显示未以http开头的字符串。例如,“z.xy”被突出显示为URL。正则表达式确实找到了https的一个实例,但是addLinks仍然将整个textView链接化。 - Some1Else
例如,尝试将“test https://www.test.com test https://www.blah.com test z.xy test”作为textView的内容。只有两个URL应该被突出显示,但它也将z.xy作为一个URL进行了突出显示。Stackoverflow从该文本中删除了https和http,但是URLS应该包含它们。 - Some1Else
我不明白,我尝试了这个字符串 -> "z.xy",并且 tv.getText().toString().matches(regex) 返回了 false,而字符串 -> "http://z.xy" 返回了 true。请检查您的代码,在我的情况下 if 运行正常。 - walkmn
1
好的,也许我的问题没有表达清楚。请尝试使用完整的文本字符串“ This is a test http://test.com more text https://another.com text here z.xy and some more text”,这将导致http和https链接都被链接化,但同时也会将z.xy突出显示为链接。我只想突出显示并链接http和https有效的URL。正则表达式检查总是返回true,因为文本中有https,但这并不能帮助突出显示仅限有效链接。希望这样能澄清事情。 - Some1Else

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接