[请教]文本里多个 URL 处理

2016-10-01 06:50:18 +08:00
 xixitalk
文本要在浏览器显示,把 URL 都转换成了 HTML 超级链接。文本里可能出现多个 URL 网址。

目前流程处理流程是:
1 、正则表达式提取 URl 的 list
2 、遍历 list 进行 replace 替换。比如: g.cn 替换成<a href="g.cn">g.cn</a>

现在遇到这样的问题:
如果一个 URL 包含另一个 URL ,替换就出现错乱。 replace 短 URL 会把长的 URL 替换搞乱。

这个应该用什么流程来处理比较合适。
3200 次点击
所在节点    Python
22 条回复
xixitalk
2016-10-01 16:35:45 +08:00
感谢,写了一个能用的

def convertMsgToHTML(msg):
#urls = re.findall('http[s]?://(?:#|[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', msg)
msg = re.sub(r'( http[s]?://(?:#|[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)', r'<a href="\g<1>" target="_blank">\g<1></a>',msg,count=0,flags=re.UNICODE|re.MULTILINE)
return msg

测试:
msg = u'''特殊 123 http://g.cn 456 http://g.cn/1234 78910 汉字
'''
text = convertMsgToHTML(msg)

print text.encode('utf-8')


输出结果:
特殊 123 <a href="http://g.cn" target="_blank">http://g.cn</a> 456 <a href="http://g.cn/1234" target="_blank">http://g.cn/1234</a> 78910 汉字
xixitalk
2016-10-01 16:51:19 +08:00
我现在明白推特的 tweet 结构里不仅保存了缩短的地址 url ,还有展开地址 expand_url ,还有一个显示地址 disp_url 。不然推文转换成 html 太低效率了。

缩短的地址保证了地址唯一性(当然还有数据统计方面的作用)
展开地址是用户原始输入的地址
显示地址保证了原始地址过长只显示前面 30 字节左右,排版美观。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/310103

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX