需求:将文字转为语音并播放,文字内容有电话格式1234-12234343和时间格式9:00-18:30,类似如下字符串:"我们上班时间:9:00-18:30,电话是1234-12234343"
实现方法:用微信的同声传译插件。
遇到问题:同声传译插件会将电话号码的1234读出一千两百三十四,听起来很奇怪有木有?=<=。
解决方法:所以我想着将电话号码之间加上空格,写个正则(/\d/g," $&"),数字是一个一个的读了。
又遇到问题:时间9:00-18:30被分割成了 9: 0 0- 1 8: 3 0,转成语音后就是九零零一八三零,也很奇怪有木有?=<=。
再次解决方法:将时间格式写个正则(/(\d+):(\d+)-(\d+):(\d+)/g,"$1点$2分到$3点$4分"),简直完美,时间格式完美读了出来^-^
又又遇到问题:处理时间的正则和电话的冲突了呀,那我电话的空格怎么加呢?
再再次解决方法:这个解决方法我研究了1天!终于写出来了,还用上了断言呢~ .replace(/(\d+):(\d+)-(\d+):(\d+)/g,"$1点$2分到$3点$4分").replace(/(?<!到)(?<!点)\d(?!点)(?!到)(?!分)/g, ' $&'),一共花了2天时间搞得正则,终于啊,成功了!迫不及待用手机扫开发版试试,听听那动人的语音结果。
又又又遇到问题:结果……手机打开一片空白,查了下微信社区,555,在ios上不支持,简直晴天霹雳,看下图官方的回复……
再再再次解决方法:再次查社区,看到下方正义之光的回答,十分感谢这位卢霄霄同志!!
我的终极解决方案:
/**
* @param {传入的原始字符串} str
*/
dealTextToVoice(str) {
// 将时间格式更换为中文
str = str.replace(/(\d+):(\d+)-(\d+):(\d+)/g, "$1点" + "$2分" + "到$3点" + "$4分")
let patt = new RegExp("\\d{4}\.", "g")
let result
// 将3位以上的数字加空格,避免语音读出计数
while ((result = patt.exec(str)) != null) {
let newNum = result[0].replace(/\d/g, '$& ')
str = str.replace(result[0], newNum)
}
return str
}
至此,完美解决~
专门登录上来给你点赞,谢谢大佬