PHP多语言字符串去特殊字符正则的JavaScript等效实现及报错解决
解决JavaScript中多语言字符串正则匹配非字母数字字符的问题
嘿,我来帮你搞定这个正则表达式的转换问题!
首先,你遇到的“无效转义”错误,原因有两个:
- JavaScript在ES2018版本之后才支持Unicode属性类(也就是
\p和\P这类语法),而且必须搭配u标志使用; - PHP里的
Xan属性在JavaScript里没有直接对应,它对应的是Alnum属性(代表Unicode字母+数字)。
JavaScript等效正则写法
PHP的/\P{Xan}+/u是用来匹配所有非多语言字母数字的字符,在JavaScript里有两种等效写法:
- 直接使用Unicode属性类取反(推荐,语义和PHP一致):
const regex = /\P{Alnum}+/u;
这里\p{Alnum}匹配所有Unicode字母和数字,\P{Alnum}就是取反,匹配不在这个范围内的字符,加上u标志开启Unicode模式。
- 显式指定字母和数字属性的取反写法(效果和上面完全一样,更直观):
const regex = /[^\p{L}\p{N}]+/u;
其中\p{L}匹配所有Unicode字母(包括中文、日文、阿拉伯文等多语言字符),\p{N}匹配所有Unicode数字,[^...]表示取反,也就是匹配不在这两类里的特殊字符。
修正你的代码片段
把你代码里的正则替换成上面的写法,另外用test()方法代替exec()会更高效(因为你只需要判断是否存在匹配,不需要获取匹配结果):
search(event) { const length = (string) => string.length > 1; const trim = (string) => string.trim() !== ''; const keyType = (string) => { // 替换成正确的JS正则 const regex = /\P{Alnum}+/u; // 用test()更高效 return !regex.test(string); }; const text = this.searchListParams.searchText; if (length(text) && trim(text) && keyType(text)) { this.searchSubject.next(this.searchListParams); } else { this.mediaListParams.startRow = 0; this.listSubject.next(this.mediaListParams); } }
额外注意事项
如果你的运行环境(比如旧版浏览器)不支持ES2018的Unicode属性转义,可以用一个兼容性稍差但能覆盖大部分多语言场景的正则:
const regex = /[^a-zA-Z0-9\u00C0-\uFFFF]+/;
不过这个写法只能覆盖Unicode基本多语言平面的字符,不如\P{Alnum}全面,所以优先推荐使用带u标志的Unicode属性类写法。
内容的提问来源于stack exchange,提问作者Sandra Willford
相关产品推荐
相关产品推荐

