帮忙写个正则,用于匹配电话号码

匹配一段电话号码,单纯的字符串匹配我已经写好了,但是要过滤一些特殊的情况
这是我写的匹配电话号码的正则,用于匹配电话号,并且添加a标签用于直接点击打电话。并不是用于获取电话号码。

let phoneRex = /(1[3-8]\d{9})(?!@)/gi
return xxx.replace(phoneRex, '&nbsp;<a class="tel-text" href="tel:$1">$1</a>&nbsp;')

但比如匹配下面这个就有问题

qwerqwer<span name='14412121212'>14412121212</span>14412121212qwerqw14412121212erqewr

由于这个正则会匹配到spanname和内部,而实际的需求是要匹配所有不被span标签包裹的14412121212,并且前面那个span标签不一定会有,所以正则是应该过滤掉那两种情况的,但是不知道怎么写

想半天没想出来,求助~~

update:

/(1[3-8]\d{9})(?!@|((("|')?>)?\S*<\/\w*>))/gi

根据大家提供的思路,最终有了这个正则
用于匹配所有不在标签内的电话号码,第一个排除@符号是因为有的邮箱是电话号码开头的,比如说14412121212@163.com

感谢大家~

阅读 4.7k
6 个回答
/(1[3-8]\d{9})(?!@|((("|')?>)?\S*<\/\w*>))/gi

根据大家提供的思路,最终有了这个正则
用于匹配所有不在标签内的电话号码,第一个排除@符号是因为有的邮箱是电话号码开头的,比如说14412121212@163.com

感谢大家~

没有太明白你的意思,只要最后一个?取匹配结果的最后一个元素?

let phoneRex = /(1[3-8]\d{9})(?!@)/gi
let str = "<span name='14412121212'>14412121212<span>14412121212"
let result = str.match(phoneRex)
console.log(result && result[result.length - 1]) // "14412121212"

还是说多个相同的电话号码只需要匹配一个,也就是匹配结果去重?

let phoneRex = /(1[3-8]\d{9})(?!@)/gi
let str = "<span name='14412121212'>14412121212<span>14412121212"
let result = str.match(phoneRex)
console.log(result && [...new Set(result)]) // ["14412121212"]

Update:
思路是匹配一个电话号码,然后用断言判断后面没有电话号码,也就是说这个就是最后一组电话号码:

let phoneRex = /(1[3-8]\d{9})(?!@|.*?\1)/gi
let str = "qwerqwer<span name='14412121212'>14412121212<span>14412121212qwerqwerqewr"
let result = str.replace(phoneRex, "<a>$&</a>") 
// "qwerqwer<span name='14412121212'>14412121212<span><a>14412121212</a>qwerqwerqewr"

额,不是很明白你的描述,如果只是需要匹配最后一个12的话,这段代码应该没问题(/12$/).test('14412121212')

/(1[3-8]\d{9})$/gi

可以这样子匹配,/<span>1[3|4|5|6|7|8]d{9}/g;还有一种处理方法,就是先找出给定字符串最后一次出现的位置,然后截取11位长度,就能找出最后的手机号码

语无伦次感。。。再写个正则把标签内容先过滤掉不就行了,不知道有没有理解,,,

我大致理解了,你要去掉两种情况1,'aaa14412121212aaa'2,>ddd14412121212aaa<

正则就先匹配不以分号'开头'结尾和>开头<结尾的电话号码字符串;然后再匹配电话号码,替换链接

推荐问题