解析字典术语的非结构化文本以包含指向术语的链接

时间:2011-10-20 14:28:36

标签: python django django-templates

我正在开发一个django项目,并且拥有一个包含things列表的模型。在整个网站中,我可能会在其他模型中输入非结构化文本。在显示页面时,我想解析非结构化文本,以获取对thing.slug的任何引用,并包含指向thing.get_absolute_url的链接。

我认为应用程序需要包含一个自定义模板标签,它解析object.text,它使用类似正则表达式解析器的东西来匹配所有{{1}字典中的任何thing.slug个术语}}

以例如:

  

我有东西A和东西B,但是想要东西C.

将修改为:

things

如果有一个django应用已经做到了这一点,太棒了!否则,任何有关如何最好地完成此任务的建议表示赞赏。即使我对它不熟悉,我也会接受其他建议,比如jquery。

2 个答案:

答案 0 :(得分:1)

urls = dict((thing.slug, thing.get_absolute_url) for thing in things)
for word in object.text.split():
  if word in urls:
     result.append('<a href="'+urls[words]+'">'+word+'</a> ')
  else
     result.append(word+' ')

答案 1 :(得分:1)

re 模块有一个 sub()函数,专为此类搜索和替换而设计。

搜索将“事物”与非结构化文本的其余部分区分开并构造相应替换字符串的模式:

>>> import re
>>> s = 'I have thing.slug and thing.foo, but would like thing.foo'
>>> re.sub(r'(\w+)\.(\w+)', r'<a href="/\1/\2">\1.\2</a>', s)
'I have <a href="/thing/slug">thing.slug</a> and <a href="/thing/foo">thing.foo</a>, but would like <a href="/thing/foo">thing.foo</a>'

这更可靠(不易出错)是让“事物”的模式更具特色:

>>> s = 'I have {thing.slug} and {thing.foo}, but would like {thing.foo}'
>>> re.sub(r'{(\w+)\.(\w+)}', r'<a href="/\1/\2">\1.\2</a>', s)
'I have <a href="/thing/slug">thing.slug</a> and <a href="/thing/foo">thing.foo</a>, but would like <a href="/thing/foo">thing.foo</a>'