You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django自定义模板过滤器实现搜索文本大小写不敏感高亮求助

解决Django模板过滤器大小写不敏感的搜索文本高亮问题

你的问题核心在于用了字符串原生的replace()方法——这个方法是大小写敏感的,只能匹配和搜索词完全一致的文本片段。要实现忽略大小写同时保留原文本大小写的高亮效果,我们可以借助Python的re正则模块来重构替换逻辑。

修改后的模板过滤器代码

import re
from django import template
from django.utils.safestring import mark_safe

register = template.Library()

@register.filter(name='highlight')
def highlight(text, search):
    # 处理搜索词为空的边界情况,直接返回原文本
    if not search:
        return text
    
    # 转义搜索词中的正则特殊字符(如.、*、?),避免解析出错
    pattern = re.compile(re.escape(search), re.IGNORECASE)
    # 用正则替换,保留原匹配文本的大小写格式
    highlighted_text = pattern.sub(lambda match: f'<b class="text text-danger">{match.group()}</b>', text)
    return mark_safe(highlighted_text)

代码关键细节说明

  • re.IGNORECASE标志:编译正则模式时开启这个标志,就能实现大小写不敏感的匹配,不管搜索词是小写、大写还是混合格式,都能命中文本中对应的内容。
  • re.escape(search):专门处理搜索词里的正则特殊字符,防止这些字符被当作正则语法解析,导致匹配逻辑混乱(比如用户搜索"django."时,不会被误判为匹配任意字符)。
  • lambda match替换逻辑:通过match.group()获取原文本中实际匹配到的内容(完整保留它原本的大小写),再包裹高亮标签,这样高亮后的文本和原文本的大小写风格完全一致。

原代码失效的原因

str.replace(search, ...)只会精确匹配和search大小写完全相同的子串,所以搜索"django"时,"Django"或"DJANGO"这类大小写不同的内容不会被识别替换,而正则的忽略大小写匹配正好填补了这个缺口。

额外安全提示

因为我们使用了mark_safe,如果你的搜索框允许用户输入HTML代码,可能存在XSS风险。如果需要更严格的安全处理,可以先对原文本做HTML转义,再进行高亮操作(普通搜索场景下用户输入的是常规文本,这个问题通常可以忽略)。

内容的提问来源于stack exchange,提问作者D_P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:56:23