问题一 : iOS系统复制通讯录手机号正则验证不通过。
问题背景 :
小程序新功能中需提交手机号 ,但iOS手机复制的手机号格式 (“138 XXXX XXXX”)无法通过手机号正则校验的 /^1\d{10}$/ ,业务要求也要去掉空格
去掉空格的方法 :
trimAll (str) {
this.setData({
custMp: str.replace(/\s+/g,"")
})
}
问题发现
今日公司销售反馈上周新上功能使用中 复制手机号提示手机号格式错误导致 订单无法提交 在验证问题的过程中 首先我想到的可能是iOS事件触发机制与安卓不同,导致校验时会不会还没有拿到粘贴的数据(我的校验放在了input的blur事件中)
custMpInputBlur( { detail } ) {
console.log( detail.value , ' blur ' )
// 获取输入框内容 返回:138xxxxxxxx , "blur" (因为在change事件中已经用上述方法将空格处理过了)
console.log( /^1\d{10}$/.test(detail.value) , ' blur ' )
// 判断输入框的内容是否可以通过手机号正则判断 返回: false , "blur"
console.log( detail.value.length , 'blur' )
//返回: 13 , 'blur'
}
与后端同事沟通中猜测有可能是因为Unicode的影响,所以console了length,结果显而易见11位的手机号打印出来的的length却是13 通过escape()方法发现确实存在Unicode。
问题修复
trimAll (str) {
this.setData({
custMp: str.replace(/[^\d]/g , '')
})
}
因为只是手机号的校验,理论上手机号不存在数字之外的符号 所以正则直接将除数字外所有的字符全部干掉就ok了 如果业务要求复杂不能简单校验的话,可以用:
trimAll(str) {
this.setData({
custMp : str.replace(/[\u061C\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068\u2069\s]*/g, '')
})
}