uni-app跨端过滤表情符号必须用纯函数而非vue.filter,因小程序不解析|语法且vue 3已移除该api;推荐使用支持unicode属性类的正则:str.replace(/\p{emoji_presentation}\p{emoji_zwj}\p{emoji_modifier}\p{emoji_modifier_base}/gu, '')。

uni-app 里用过滤器去除表情符号,本质是字符串清洗,但必须注意:小程序端 Vue.filter 不生效,H5 端也仅限 Vue 2 模式;真正跨端可用的,是纯函数 + 显式调用或计算属性。
为什么不能直接写 Vue.filter('removeEmojis', ...)
你在 main.js 里注册了过滤器,模板里写 {{ text | removeEmojis }},H5 可能正常,但微信/支付宝/字节小程序真机一跑,原样输出、不报错也不执行——不是你正则写错了,是 uni-app 小程序编译器压根不解析 | 语法。Vue 3(uni-app 3.x)更已彻底移除该 API。
真正能跨端生效的正则写法
Emoji 覆盖范围极广(基础 emoji、ZJW 增补平面、emoji 序列如 '??'、皮肤修饰符等),单靠 /[\u{1F600}-\u{1F64F}]/u 远不够。推荐用经过实战验证的清洗正则:
const removeEmojis = (str) => {
if (typeof str !== 'string') return ''
return str.replace(/[\p{Emoji_Presentation}\p{Emoji_ZWJ}\p{Emoji_Modifier}\p{Emoji_Modifier_Base}]/gu, '')
}
这个正则依赖 u 标志和 Unicode 属性类,现代环境(H5 / 微信基础库 ≥ 2.20.0 / 支付宝 ≥ 10.2.80 / iOS Safari / Chrome)均支持。关键点:
- 必须加
g标志,否则只删第一个 - 必须加
u标志,否则 \p{} 无效且可能报错 -
typeof str !== 'string'兜底,避免null或undefined导致.replace报错 - 不要在正则里硬塞大量 Unicode 范围(如 \u{1F300}...\u{1F9FF}),维护困难且易漏
怎么在页面中安全使用
放弃模板管道符,改用以下任一方式,确保 H5、小程序、App 全端一致:
- 在
setup()中导入并直接调用:const cleanText = removeEmojis(rawText),然后绑定到:text="cleanText" - 需要响应式更新时,用
computed:const displayText = computed(() => removeEmojis(props.content)) - 若用于表单输入框展示态(如预览),
@input中不要改原始值,而是另起一个previewText响应式变量 - 切勿在
v-if或v-for条件中调用该函数——它不返回布尔值,且无缓存,高频触发影响性能
最易被忽略的是:某些旧版安卓 WebView 或低端小程序基础库对 \p{} 支持不全。上线前务必在目标机型真机测试,若失败,降级为社区维护的 emoji-regex 库(注意选 esm 版本),而非自己拼 Unicode 范围。











