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