首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用户输入数据的Python -Filtering链接

用户输入数据的Python -Filtering链接
EN

Stack Overflow用户
提问于 2012-09-09 07:44:19
回答 1查看 330关注 0票数 0

什么是安全有效的方式来从用户输入的数据中过滤链接,并创建然后在html中使用的锚链接。就像当你写一个问题时,你复制粘贴一个链接,它会自动变成一个锚链接。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-09 08:25:03

使用Gruber's regular expression查找URI。

代码语言:javascript
复制
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)

结果:

代码语言:javascript
复制
foo <a href="http://www.stackoverflow.com">http://www.stackoverflow.com</a> bar

现在,Gruber正则表达式实际上将匹配部分URI,例如www.stackoverflow.com (缺少http://方案),当您只将其放入锚标记中时,这将不起作用。您可以编写一个函数来检查这一点,并在必要时添加它,然后使用它进行替换:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12335385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档