国际惯例,先放github:
https://github.com/razerdp/HttpUrlTextView
或者apkbus:
http://www.apkbus.com/forum.php?mod=viewthread&tid=248196
需求:
1 - 能够识别出一大堆文字里面的url
2 - 能够识别出非http://|https://|ftp://等协议开头的非标准url
3 - 对于原来已经存在clickspan的文字不能去掉其点击事件
4 - url可点击
分析:
虽然android的textview自带了autoLink属性,但是用过的人都知道,两个链接之间的文字,或者有时候文字带着链接会导致整一个文字都变成可点击的链接,这对用户体验并不好。因此就有了这次的定制。
针对第一点,和第二点,其实两者都一样,要识别出一大堆东东里面的某个小东西,正则是我想到的比较好的解决方法,而且网络上有很多正则相关的,经受过考验的表达式(虽说有正则就必定有绕过。。。。)
针对第三点,我们可以通过span.getSpans来获取每个span然后手动拼接起来。
针对第四点,没啥好说的,直接用ClickableSpan解决
开工:
- 一、
能够识别出一大堆文字里面的url
能够识别出非http://|https://|ftp://等协议开头的非标准url
-
首先上网查查识别url的正则表达式,毕竟不制造重复的轮子是我们的宗旨←_←
-
于是乎,咱们就得到了这一个:
-
((http|ftp|https)://)(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(:[0-9]{1,4})*(/[a-zA-Z0-9\&%_\./-~-]*)?
-
-
初看了一下,是不是有很明显的http等协议头,现在当作咱们不了解正则(事实上我还真不是非常了解),然后看了看,一大堆东西干毛啊!!!
-
-
不过不看不行啊,,,,orz于是只能硬着头皮分析一下,正则的语法咱们就不说了,网上一大堆,看一下这个正则表达式,有木有发现有一个符号我们很熟悉?就是这个→“|”,写android,准确的说咱们写代码的时候应该经常用到“||”这个符号,代表或者的意思,这里也是,这个“|”符号就是意味着匹配“|”前的正则或者匹配“|”后的正则
-
-
那也就是意味着,在http等协议头后面的,就是url,也就是aaa.bbb.ccc/ddd/eee/fff......,这也就符合了需求的第二点,于是咱们就改了一下这个表达式(其实就是ctrl +c/v 大法)
-
就变成了这样:
-
((http|ftp|https)://)(([a-zA-Z0-9\._-]+\.[a-zA-Z]{2,6})|([0-9]{1,3}