正则高亮需加g和i标志,关键词须转义特殊字符;v-html渲染前用encodeuricomponent编码再decodeuricomponent解码;空关键词要守卫处理;ios下v-html样式失效优先检查rpx缩放及style写法。

uni-app里用正则高亮搜索关键词,replace必须加全局标志g
不加g只会替换第一个匹配项,页面上只高亮首个关键词,后续重复词全失效。这是最常踩的坑。
实际写法要确保正则对象带g(全局)和i(忽略大小写),比如用户搜“Vue”,得同时匹配“vue”“VUE”“Vue”。但注意:new RegExp(keyword, 'gi')中,如果keyword含正则特殊字符(如.、*、(),会直接报错或误匹配——必须先转义。
- 用
keyword.replace(/[.*+?^${}()|[]\]/g, '\$&')预处理关键词 - 再构造正则:
new RegExp(escapedKeyword, 'gi') - 替换时用
'<span style="color: #f56c6c;">$&</span>',$&代表整个匹配内容,比$1更安全
在v-html里渲染高亮HTML,得用decodeURIComponent防编码污染
uni-app的v-html会把、<code>>等自动转义,导致<span></span>标签原样输出成文字,不生效。常见表现是页面上直接看到<span style="color:#f56c6c;">关键词</span>。
解决方法不是关掉转义(不安全),而是提前把HTML字符串用encodeURIComponent编码,再在v-html绑定前用decodeURIComponent解码。但更稳妥的做法是:在计算属性里生成已解码的HTML字符串,直接赋给data字段。
- 别在
data里存原始带<span></span>的字符串,而是在computed里返回decodeURIComponent(highlightedStr) - 确保
v-html绑定的是这个计算属性,不是原始字符串 - 如果用了
rich-text组件,它不支持内联样式,必须改用v-html+div
watch监听搜索关键词时,空字符串和null要单独处理
用户清空输入框瞬间,keyword可能是空字符串''或null,此时若直接丢进new RegExp,会匹配全文(正则/()/g匹配任意位置),导致所有文字都被套上span,页面变红一片。
必须在高亮逻辑开头加守卫:
- 用
if (!keyword || keyword.trim() === '') return text快速返回原文 - 不要用
== null,因为'' == null为false,但'' == undefined也是false,严格判断更稳 - trim()防用户输空格后触发误匹配
真机调试时iOS下v-html样式失效,优先检查span是否被父容器font-size缩放影响
很多开发者发现安卓正常、iOS文字没变色,查DOM发现span节点存在,但颜色不生效。大概率是父级view设置了font-size: 28rpx之类,而iOS对rpx在v-html内联样式中的解析有偏差,导致color被覆盖或继承异常。
临时解法是把颜色提到class里,用<style></style>全局定义;长期建议统一用rem或px写死字号,避开rpx在富文本里的兼容问题。
另外,iOS Safari对v-html里style属性的支持不如Chrome严格,style="color:#f56c6c;font-weight:600"这种多属性写法偶尔抽风,拆成单属性或改用class更可靠。











