【问题标题】:Android Regex text url to convert as clickable linkAndroid正则表达式文本网址转换为可点击的链接
【发布时间】:2017-03-11 09:16:02
【问题描述】:

我对正则表达式字符串和操作非常陌生。但我正在尝试开发一个需要将文本 url(不带标签)从整个字符串替换为

<a href='$link'>$link </a> 

我找到了工作代码 -

text_to_url= text_to_url.replaceAll("(<a[^>]+>)|(http(?s)://.*)", "<a href=\"$0\">$0</a>");

但正如我上面所承认的,我对正则表达式单词和函数非常陌生。 即使我可以使用该代码在标签内获取 url,但它不会在 url 末尾停止(我认为根据 *)。

问题是,如果有2个或多个连续的link_text_urls并排或逐行显示为一个链接(url是第一次出现的url)。

我尝试了很多次并通过谷歌搜索找到这个位结果。但是我的正则表达式知识无法帮助我找到它。

请告诉我答案。非常感谢您理解我的问题。

示例文本 -

<h3>Post Title</h3>
<p>This is a paragraph of text of the post</p>
<img src="http://imageurl">
<p>Please read more on this link</p><br/>
http://www.readmorelink.com/1212/1212post

【问题讨论】:

  • 那么如果一个字符串中有多个链接,那么确切的结果应该是什么?您想要从中分离链接的列表吗?
  • 也必须在正则表达式中还是另外java代码也可以?
  • 我想正则表达式那些 text_url 以在 a> 标记之间进行编码,因为有问题。因为我的输出是在 webview 上。
  • @stamanuel,是的,可以有更多。
  • Using RegEx to parse HTML isn't a good idea。你可以使用 Jsoup。

标签: android regex regex-negation


【解决方案1】:

我可以在您的正则表达式中看到一个小错误。它应该是 https? 而不是 http(?s) 以使 s 可选。 (?s) 表示内联修饰符,使 . 也匹配换行符。
至于

但它不会停在 url 的末尾(我认为根据 *)


是的,你是对的,这是因为*greedy by default。您可以通过在其后添加 ? 来使其变得懒惰。
但更好的方法是使用这个

text_to_url= text_to_url.replaceAll("(?<!\")(https?://[^\s\n]*)(?!\")", "<a href=\"$0\">$0</a>");

[^\s\n]* 将匹配任何非空格或换行符零次或多次的字符。

【讨论】:

  • 感谢您的出色回答,您的代码在更改 "replaceAll("(]+>)|(https?://[^\\s\\n] *)", "$0");" .但它也取代了 img 标签。如何从这个正则表达式中排除 img src。非常感谢。
  • 你能把文字也发一下吗?
  • 是的,我对问题进行了编辑。在示例中,有一个没有 a> 标签的 text_link。我想像这些文本一样正则表达式只是为了成为一个>标签封闭的链接。谢谢。
  • 更新了答案。您可以保留 ... 标签,只替换裸 URL 以使其可点击
【解决方案2】:

您使用的正则表达式似乎是错误的。

试试这个:

text_to_url = text_to_url.replaceAll("(?i)\\b((?:[a-z][\\w-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:'\".,<>?«»“”‘’]))", "<a href=\"$0\">$0</a>");

这个正则表达式不是来自我,它实际上来自 john gruber,并且在这里得到了很好的解释:http://daringfireball.net/2010/07/improved_regex_for_matching_urls

您可以在各种编辑器中尝试使用正则表达式,例如这个:https://regex101.com/ - 他们很容易理解发生了什么。

【讨论】:

  • 感谢您的回答,您的代码可以将输出作为所需的结果。但它也取代了
猜你喜欢
  • 1970-01-01
  • 2014-01-02
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多