0

ユーザーが入力したデータからリンクをフィルタリングし、HTMLで使用されるアンカーリンクを作成するための安全で効率的な方法は何ですか。質問を書くときのように、リンクをコピーして貼り付けると、自動的にアンカーリンクになります。

4

1 に答える 1

1

Gruberの正規表現を使用して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正規表現は実際にはwww.stackoverflow.com(スキームが欠落しているhttp://)などの部分的なURIと一致します。これは、アンカータグに貼り付けるだけでは機能しません。それをチェックして必要に応じて追加する関数を記述し、それを使用して置換を行うことができます。

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)
于 2012-09-09T00:25:03.047 に答える