遇到个神奇的线上问题,用户反馈身份证校验过不去,说是身份证并没有输错

拿身份证号用在线工具校验一下,发现确实没啥问题

我自己在UAT环境试了下,发现校验是通过的,并不会被拦截。
这可咋办,因为校验是前端拦截的,都没发起请求,此处也没有针对性地去做埋点,所以并不会有日志记录

这下只能去请教大佬了,大佬不愧是大佬,马上就想到是零宽空格搞得鬼

零宽空格不占据宽度,也没任何其他显示效果,但在字符串里他是真实存在的,所以无法通过身份证的正则校验。这类一般用于控制排版。
零宽空格是可以被复制粘贴的,很可能用户输入的这个身份证是直接复制粘贴过来的,把零宽空格也给粘贴过来了。

举个例子

1
你​好​,​这​是​一​个​含​有​零​宽​空​格​的​字​符​串​。

直接复制上面的字符串,在https://unicode-explorer.com/search/这个网站粘贴复制的内容
可以看到上面的字符串每隔一个字符有一个零宽空格,但是在实际展示的时候零宽空格是看不出来的

我们写个正则去将零宽字符匹配出来过滤掉即可

1
str = str.replace(/[\u200B\u200C\u200D\uFEFF\u200E\u200F]/g, '');