[请教]文本里多个 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 替换搞乱。

这个应该用什么流程来处理比较合适。
3201 次点击
所在节点    Python
22 条回复
msg7086
2016-10-01 07:04:11 +08:00
举个栗子?
imn1
2016-10-01 07:32:31 +08:00
先把文本格式写出来才能讨论
lxy42
2016-10-01 07:59:52 +08:00
正则表达式兼容 URL 中包含参数的情况
xiaojj
2016-10-01 08:07:07 +08:00
按你匹配的结果按顺序一个一个替换,不要一次性把文本里面的 g.cn 都替换成链接的 html
ebony0319
2016-10-01 09:39:59 +08:00
xixitalk
2016-10-01 09:41:36 +08:00
文本例子
文本:第一个地址: http://g.cn 第二个地址: http://g.cn/1234

替换后:第一个地址:<a href="http://g.cn">http://g.cn</a> 第二个地址:<a href="http://g.cn/1234">http://g.cn/1234</a>
xixitalk
2016-10-01 09:42:40 +08:00
正则表达式提取了整个 URL ,包括参数的
xixitalk
2016-10-01 09:44:35 +08:00
@ebony0319 不是,这是一个 URL,不是多个
zjuhwc
2016-10-01 09:46:06 +08:00
你提取 URL 用的正则都可以提取出出 g.cng.cn/1234 两种情况,那替换的时候就用一样的规则替换啊
xixitalk
2016-10-01 09:46:20 +08:00
@xiaojj 正则替换吗?直接 replace 不好写吧
xixitalk
2016-10-01 09:49:26 +08:00
@zjuhwc 替换 g.cn 的时候会把 g.cn/1234 里前半部分替换掉,后者会变成<a href="http://g.cn">http://g.cn</a>/1234 这样的。
zjuhwc
2016-10-01 09:52:33 +08:00
@xixitalk 你提取的时候是怎么做到提取的是 g.cn/1234 而不是 g.cn 的?
zjuhwc
2016-10-01 09:58:49 +08:00
哦,看明白了,你想用 replace 。问题是你都用正则提取了,为啥不直接用正则替换。比如你提取用的是 re.match(pattern, string) ,你可以直接用 re.sub(pattern, repl, string, max=0) 做正则替换,复用之前的 pattern 啊
buir
2016-10-01 10:59:37 +08:00
很简单 写个软件就可以了~
aploium
2016-10-01 11:00:25 +08:00
这是因为你正则写得不好啊
自行 google 一下 "regex url"
aploium
2016-10-01 11:04:34 +08:00
还有正则引擎一般都带有 sub 功能的, 就是直接把匹配到的东西原地替换
比如(Python)

>>>re.sub(r"( http://go\.cn)",r"""<a href="\1">\1</a>""", "http://go.cn")
<a href="http://go.cn">http://go.cn</a>
moxiaonai
2016-10-01 11:49:35 +08:00
正则写的更准确一点应该能解决
Shazoo
2016-10-01 12:39:42 +08:00
1. 正则原地替换
2. 如果觉得正则替换代码可读性低了点,不好维护,就在创建 list 的时候,保留这个 sub 字串的 pos ,后续在利用 pos 进行替换。

粗略一想,没试验,用哪种,还是自己评估。


不过我个人建议方案 1 。正则这东西,就是个坎,肯定得学习到一定程度的。长痛不如短痛,好好记忆吧。
arnofeng
2016-10-01 13:40:22 +08:00
正则没写好 你要匹配到斜杠的
imn1
2016-10-01 14:53:06 +08:00
还是没有说清楚格式
如果每行一个 url
^(.+)$ -> <a href="$1">$1</a><br>
就够了
如果是没有分行,就要说清楚 url 之间是怎么分隔的

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

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

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

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

© 2021 V2EX