上回讲解了《Django 过滤Html指定标签》,过滤的的办法使用了Django的内置的fliter removetags函数,这个有它适合的使用场合;但如果想过滤由Web编辑器产生的HTML标签,用它就显得过于臃肿,效率有点低了。因为你要找出全部的html标签,作为参数传进函数,这么一来可能几十个html标签作为参数一起传到removetagd函数里,显然不是Pythonic的做法。今天利用正则表达式自定义个函数,旨在代码的简洁性和性能优化方面,将html标签过滤了,所以正则表达式可能没有想周全,但是过滤点Web编辑器产生的最常用的标签是够用了。废话少说了,看函数实现:
import re
def remove_html_tags(str_html):
return re.compile('</?\w+[^>]*>').sub('',str_html)
熟悉正则的同学,很清楚该函数过滤的只是<>和里面的字符;因为html正好大都由这些标签组成的,一般情况下,过滤掉了这些标签,html就只剩下文字了。适合的场合可能是过滤文章的正文,这些正文都是使用Web编辑器处理过的字符。若你想把一个完整的html页面,过滤掉html标签,那可能就不适合了,因为完整的html页面源码,包含有CDATA link script注释等等这些零碎的东西,短短的</?\w+[^>]*>正则表达式没有这么强大的功能;希望抛砖引玉吧..
在Django的模板中怎么使用该函数呢?下面附带简洁自定义我们的filter。在app中建立一个templatetags文件夹,在文件夹里建立一个空的__init__.py和base_filter.py文件,把下面的代码copy上去:
#coding=utf-8
import re
from django import template
register = template.Library()
@register.filter
def remove_html_tags(str_html):
return re.compile('</?\w+[^>]*>').sub('',str_html)
然后在模板中引用我们自定义的filter:
{%load base_filter%}
最后使用该filter即可,比如把资讯的正文,过滤掉html,转义后截取一部分出来,照猫画虎吧:
{{news.content|remove_html_tags|safe|escape|truncatewords_html:12}}
2012年补充:
striptags
随着Django 1.3的修正,其实它自身带有一个标签函数实现了以上的功能,具体参考:striptags吧!(完)