Python - 从用户输入的数据中过滤链接

时间:2012-09-08 23:44:19

标签: python html

从用户输入的数据中过滤链接并创建随后在html中使用的锚链接的有效方法是什么?就像编写问题时一样,复制粘贴链接时,它会自动成为锚链接。

1 个答案:

答案 0 :(得分:1)

使用Gruber's regular expression查找URI。

import re

text = "foo http://www.stackoverflow.com bar"

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

print uri_re.sub(r"""<a href="\g<0>">\g<0></a>""", text)

结果:

foo <a href="http://www.stackoverflow.com">http://www.stackoverflow.com</a> bar

现在Gruber正则表达式实际上会匹配部分URI,例如www.stackoverflow.com(这是缺少http://方案),当你只是将它粘贴到锚标签时,这将无效。您可以编写一个检查该功能的函数,并在必要时添加它,然后使用它来进行替换:

text = "foo www.stackoverflow.com bar"

def link(match):
    uri = match.group()
    if ":" not in uri[:7]:
        uri = "http://" + uri
    return r"""<a href="{0}">{0}</a>""".format(uri)

print uri_re.sub(link, text)