`
三月沙
  • 浏览: 620810 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

django 自定义截取中文的过滤器

 
阅读更多

django 自带的模板过滤器truncatewords和truncatewords_html 都是不支持中文的,前者是截取不带html标签的内容,后者截取带html标签的内容。为了达到截取中文的目的,按照truncatewords和思路重新编写了字符截取工具

 

这个新的truncatewords函数是从带html标签的内容或不带html内容中截取字符的,中英文皆可,截取之后会去掉原有的标签,只保留内容

 

 

##################################################################################
#截取字符工具,不保留html
##################################################################################
def truncatewords(s,num,end_text='...'):

    re_tag= re.compile(r'<(/)?([^ ]+?)(?: (/)| .*?)?>')
    re_words = re.compile(u'(&.*?;)|[\u4e00-\u9fa5]{1}|[^\u4e00-\u9fa5]{1}',re.UNICODE)
    
    s = force_unicode(s)

    length=int(num)

    if length<=0:
        return u''
    
    pos = 0
    words=0
    data=[]
    out=''
    current_word = ''
    while words <= length:
    	if words==length:
    		break

        #查找第一个标签结束的>
        m= re_tag.search(s,pos)
        if not m:
            break
        pos = m.end()

        #开始从这个位置向后搜索字符,匹配到第一个字符,停止,检查,如果字符是<,说明匹配到了html标签了,则跳出去,否则开始检查下一个标签的>
        while words <= length:
            if words==length:
                break
            m = re_words.search(s,pos)   
            if not m:
                break
            current_word = m.group()
            if current_word=='<':
                break
            else:
                if not m.group(1):
                    words+=1
                    data.append(str(m.group()))
                    pos+=1
                else:
                    words+=1
                    data.append(str(m.group()))
                    pos=m.end()

    out = ''.join(data)

    out+=end_text
    return out

 

truncatewords_html 也是截取内容,但其保留了html标签

 

 

##################################################################################
#截取字符工具,保留html
##################################################################################
def truncatewords_html(s,num,end_text='...'):
    
    html4_singlets = ('br', 'col', 'link', 'base', 'img', 'param', 'area', 'hr', 'input')
    re_tag= re.compile(r'<(/)?([^ ]+?)(?: (/)| .*?)?>')
    re_words = re.compile(u'(&.*?;)|[\u4e00-\u9fa5]{1}|[^\u4e00-\u9fa5]{1}',re.UNICODE)
    
    s = force_unicode(s)
    
    
    length=int(num)
    
    if length<=0:
        return u''
    
    pos = 0
    words=0
    current_word = ''
    open_tags=[]
    while words <= length:
        if words==length:
            break

        #查找第一个标签结束的>
        m= re_tag.search(s,pos)
        if not m:
            break
        pos = m.end()
        closing_tag,tagname,self_closing=m.groups()
        
        #自关闭标签不处理,或者是单标签
        if self_closing or tagname in html4_singlets:
            pass
        elif closing_tag:
            # Check for match in open tags list
            try:
                i = open_tags.index(tagname)
            except ValueError:
                pass
            else:
                #移除该标签,说明该标签已经闭合
                open_tags.remove(tagname)
        else:
            #把标签加入到仍然打开的标签中
            open_tags.insert(0, tagname)
            
        #开始从这个位置向后搜索字符,匹配到第一个字符,停止,检查,如果字符是<则跳出去,否则开始检查下一个标签的>
        while words <= length:
            
            if words==length:
                break
            m = re_words.search(s,pos)
            if not m:
                break
            current_word = m.group()
            if current_word=='<':
                break
            else:
                if not m.group(1):
                    words+=1
                    pos+=1
                else:
                    words+=1
                    pos=m.end()
    #如果本身的大小就不够,则不加结尾
    if pos==len(s):
    	return s
    out = s[:pos]
    if end_text:
        out += ' ' + end_text
    # Close any tags still open
    for tag in open_tags:
        out += '</%s>' % tag

    # Return string
    return out
0
12
分享到:
评论

相关推荐

    Django 过滤器汇总及自定义过滤器使用详解

    下面将详细介绍一些常见的Django过滤器以及如何创建自定义过滤器。 1. `upper`:将字符串转换为大写,如`{{ user.name | upper }}`将输出用户名的大写形式。 2. `add`:给变量加上指定的数值,例如`{{ user.age | ...

    Go-pongo2-一个类似Django语法的Go模板引擎

    过滤器则允许对变量的值进行操作,比如`| upper`将字符串转为大写,`| slice:0:3`截取字符串的前三个字符等。 3. **函数调用**:Pongo2支持在模板中调用自定义函数,这使得模板更加灵活。你可以注册自定义的函数来...

    PythonWeb从入门到实战教程之6模板和模板引擎.zip

    模板过滤器是应用在变量上的函数,可以对变量的值进行转换或处理,例如格式化日期、转换大小写、截取字符串等。通过管道符(|)与变量连接,如`{{ variable|filter_name }}`。 5. 模板上下文: 模板上下文是传递给...

    symfony twig详情

    - **自定义标签和过滤器**:开发者可以定义自己的标签和过滤器来满足特定需求。 #### 常见标签和过滤器详解 - **abs**:返回数字的绝对值。 - **batch**:分批处理数组。 - **capitalize**:首字母大写。 - **...

    Dotiac DTL-开源

    3. **过滤器**:如同Django,Dotiac DTL提供了一系列内置过滤器,如`lower`用于转换字符串为小写,`upper`转换为大写,`truncatechars`截取字符串等。这些过滤器可以方便地应用于模板中的变量,对数据进行处理。 4....

    Flask模板引擎之Jinja2语法介绍

    除了内置的过滤器和测试外,开发者还可以根据需求自定义新的过滤器和测试。这需要在 Flask 应用中通过 `app.jinja_env.filters` 和 `app.jinja_env.tests` 来注册。 ##### 2. 宏 (Macros) 宏类似于函数,可以在模板...

Global site tag (gtag.js) - Google Analytics