Android linkify URL链接非URL

时间:2015-11-03 22:12:17

标签: android regex linkify

我想在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个参数应该是什么?

感谢您提供有关此功能的任何提示。

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

来自:https://stackoverflow.com/a/5713866/2980992

答案 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