【问题标题】:Android linkify URLs links non URLsAndroid linkify URLs 链接非 URLs
【发布时间】:2016-02-04 06:02:19
【问题描述】:

我想让文本视图中的网络链接可点击。我用了这段代码

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

它确实链接了网站 URL,但似乎也随机链接了其他文本,如 z.xyz dzo.yzw 等。

如何告诉 linkify 只链接 URL?为了尝试检测以 http:// 或 https:// 开头的链接,我尝试了这种模式编译

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

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

感谢您提供任何提示以使其正常工作。

【问题讨论】:

    标签: android regex linkify


    【解决方案1】:

    这是对应于 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

    【讨论】:

    • 说它是 RFC 的实现在这里有点牵强,不是吗?作者说它开始更简单,并且随着测试变得越来越复杂。仍然有人抱怨一些边缘情况。
    【解决方案2】:

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

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

    这只会链接 URL,而不是链接其他由句号分隔的 2 个单词的字符串,就像 Linkify.WEB_URLS 可以做的那样。

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

    希望能帮助遇到同样问题的其他人。

    【讨论】:

    • 给定的正则表达式以及默认的自动链接在 android 5 和 6 上对我来说是错误的。它包括在实际链接之后的链接的下一个单词。
    【解决方案3】:

    你可以这样走:

    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

    【讨论】:

    • 这仍然突出显示不以 http 开头的字符串。例如,“z.xy”突出显示为 URL。正则表达式确实发现了 https,但 addLinks 仍在链接整个 textView。
    • 例如,尝试“testtest.comtestblah.comtest z.xy test”作为textView的内容。仅应突出显示 2 个 URL,但它也将 z.xy 突出显示为 URL。 Stackoverflow 从该文本中删除了 https 和 http,但 URLS 应该有它们。
    • 我不明白,我试过这个字符串->“z.xy”和tv.getText().toString().matches(regex)返回false,字符串->“z.xy”返回true。检查您的代码,在我的情况下,if 工作正常。
    • 好的,也许我的问题不够清楚。尝试全文字符串 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,但这无助于仅突出显示有效链接。希望能解决问题。
    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2021-08-23
    • 2021-10-05
    • 2011-10-23
    相关资源
    最近更新 更多