23

JS使用replace()方法匹配替换手机号、座机号、带区号连接符座机号

老客户的一论坛需要把会员发布的手机号、座机号转成可点击拨号的链接,首先我考虑,是要在会员发布提交时进行处理,还是在发布后进行处理。

我选择在发布后进行前台处理。

需要使用JS replace()方法和正则知识

另一篇关于replace方法与正则基础知识的介绍

测试代码实例:

解释:

因为客户代码中是要对不相连的多个区块中进行处理,所以选择器只能抓取comeing类,这样的话,下面就必须使用for循环,如果可以选择整个区域的话,那选择器就抓取mrdede类,不使用for循环,matchHtml = matchS.eq(i).html()改为matchHtml = matchS.html()即可。

replace方法正则替换

var regexp = new RegExp(/(1)(2)(3)/g);

se = matchHtml.replace(regexp, ‘$3 $1 $2′);

RegExp中的正则表达式,其中在两个正斜杠“/”之间区域,有并列的多个(),

那么这多个()把匹配的内容,从左向右依次为$1 $2 $3 ……

如果:

var regexp = new RegExp(/(123)/g);

se = matchHtml.replace(regexp, ‘$1我被找到了’);

RegExp中的正则表达式,其中在两个正斜杠“/”之间区域,只有一个()或没有(),

那么只有$1可以参与替换,

替换时不是一定要使用$1 $2 $3 …… 进行替换,也可以使用其它字符进行替换。

关于实例中正则的解释(从左向右依次解释):

全部原始正则表达式([^0-9])([0-1]{1}[1-9][0-9]{1,2}[^0-9]?[0-9]{7,8}|[1-9]\d{6,7})([^0-9])

([^0-9])以非数字开头(即$1)

原始中的第二段([0-1]{1}[1-9][0-9]{1,2}[^0-9]?[0-9]{7,8}|[1-9]\d{6,7}) 即$2

[0-1]{1}解释:0到1之间(含)的数字必须出现一次

[1-9]解释:1到9之间(含)的数字必须出现一次

[0-9]{1,2}解释:0到9之间(含)的数字至少出现一次,最多出现两次

[^0-9]?解释:非数字的任意一个字符至少出现0次,最多出现一次

[0-9]{7,8}解释:0到9之间(含)的数字至少出现7次,最多出现8次

|解释:或者的意思

[1-9]解释:1到9之间(含)的数字必须出现一次

\d{6,7}解释:0到9之间(含)的数字至少出现6次,最多出现7次

最后面的([^0-9])解释:以非数字结尾(即$3 这样就能保证不匹配以0或1开头的大于12位的数字串了)

注注注:

此正则写法只可使用在JS的replace方法进行替换的情况,如果想用在其它地方,需要去掉正则前后的([^0-9]) 即使用[^0-9])([0-1]{1}[1-9][0-9]{1,2}[^0-9]?[0-9]{7,8}|[1-9]\d{6,7})([^0-9],但是如果想更严谨一些的话,可以再改造。

其实我写的这段正则用在replace方法中匹配替换手机号与座机号时,还是不太严谨,但是绝大多数情况还是可以的。

==========================================

修改:

就在刚才,发布完文章,又做了一下修改,上面实例中双斜杠注释掉的部分是原来的

在它下面两行是改后的,这样就更严谨一些了。

var regexp = new RegExp(/([^0-9])([0-1]{1}[1-9][0-9]{1,2})([^0-9]?)([0-9]{7,8}|[1-9]\d{6,7})([^0-9])/g);

se = matchHtml.replace(regexp, '$1<a style="color:#09f;text-decoration:underline;" href="tel:$2$4">$2$3$4</a>$5');

把原来中间部分([0-1]{1}[1-9][0-9]{1,2}[^0-9]?[0-9]{7,8}|[1-9]\d{6,7})改为([0-1]{1}[1-9][0-9]{1,2})([^0-9]?)([0-9]{7,8}|[1-9]\d{6,7})

也就是把原来的中间部分分成了三个部分,现在全部正则为/([^0-9])([0-1]{1}[1-9][0-9]{1,2})([^0-9]?)([0-9]{7,8}|[1-9]\d{6,7})([^0-9])/ 

所以在替换的时候就有$1$2$3$4$5这五个部分可以参与替换了。

其中$2各$4是实际打可拨打号码的部分,所以在链接中使用href=”tel:$2$4″

中间部分就是$2$3$4的组合了

尾部$5

这样就防止替换的座机号存在非数字时也参与拨号的情况出现了,如抓取到的号码为010-12345678或010 12345678,在拨打时就是01012345678

我不知道在拨号时区号与直拨号间有横杠或空格时能不能拨得出去,没试,也就不试。

个人感觉,严谨一些的话,还是现在这样写正则比较好。

==========================================

再次修改正则:

上一次修改后不能匹配7位和8位的电话直拨号,有错误。

这回测试了,可用,没问题了。哈哈

另附一图,关于replace的替换变量的规律的,如下:

JS使用replace()方法匹配替换手机号、座机号、带区号连接符座机号