如何使用正则匹配手机号码后8位不能为相同数字?

都市放牛郎 2015-06-01 11:27:49
如何使用正则匹配手机号码后8位不能为相同数字?

目前我已经有匹配手机号码的正则表达式 /^1[3,5,8,7]\d{9}$/ 需要修改修改。但是想了很久也没想出来请各位大神帮忙2
...全文
871 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
liwubin_88 2019-03-09
  • 打赏
  • 举报
回复
参考这篇文章,很有启发,讲的也很清楚:
正则表达式匹配重复的字符串
var str="17788888234";
var reg=/1\d{2}(\d)\1{3}(?!\1)\d{4}/gi;
document.write(reg.test(str));

夏之冰雪 2015-06-02
  • 打赏
  • 举报
回复
引用 9 楼 xuzuning 的回复:
$a = array(
    '13012345678',
    '13211113333',
    '13644444444',
    '136a4444224',
);
 
$p = '/(?=\d{11})(?=1[3587]\d(?!(\d)\1{7}))/';
foreach($a as $t)
  var_dump($t, preg_match($p, $t));
string(11) "13012345678"
int(1)
string(11) "13211113333"
int(1)
string(11) "13644444444"
int(0)
string(11) "136a4444224"
int(0)

老大,您少了^和?哦~~~
$a = array(
    '13012345678',
    '13211113333',
    '13644444444',
    '136a4444224',
	'1321111333332131',
	'dasd1321111333332131'
);
string(11) "13012345678"
int(1)
string(11) "13211113333"
int(1)
string(11) "13644444444"
int(0)
string(11) "136a4444224"
int(0)
string(16) "1321111333332131"
int(1)
string(20) "dasd1321111333332131"
int(1)
夏之冰雪 2015-06-01
  • 打赏
  • 举报
回复
引用 1 楼 microlab2009 的回复:
正则没那么智能吧,还是用程序判断吧
正则我觉得还是很智能的,可以做很多好玩的匹配。
夏之冰雪 2015-06-01
  • 打赏
  • 举报
回复
引用 2 楼 jam00 的回复:

$str='13855555555';
if(preg_match('/^1[3,5,8,7]\d(\d)\1{7}$/',$str,$m)){
	echo '后面 8 位数字不能相同';
}else{
	echo '通过';
}
你写的有问题,传递个abc字符串都能通过。
夏之冰雪 2015-06-01
  • 打赏
  • 举报
回复
<?php
$ar = array(
	'13012345678',
	'13211113333',
	'13644444444'
);

foreach($ar as $val)
{
	if(preg_match('/^1[3,5,8,7]\d(?!(\d)\\1{7})\d{8}/', $val))
	{
		echo $val . ' is ok.';
	}
	else
	{
		echo $val . ' is fail.';
	}
	echo '<br/>';
}
13012345678 is ok. 13211113333 is ok. 13644444444 is fail.
果酱很好吃 2015-06-01
  • 打赏
  • 举报
回复

$str='13855555555';
if(preg_match('/^1[3,5,8,7]\d(\d)\1{7}$/',$str,$m)){
	echo '后面 8 位数字不能相同';
}else{
	echo '通过';
}
嘻哈大咖秀 2015-06-01
  • 打赏
  • 举报
回复
正则没那么智能吧,还是用程序判断吧
xuzuning 2015-06-01
  • 打赏
  • 举报
回复
$a = array(
    '13012345678',
    '13211113333',
    '13644444444',
    '136a4444224',
);
 
$p = '/(?=\d{11})(?=1[3587]\d(?!(\d)\1{7}))/';
foreach($a as $t)
  var_dump($t, preg_match($p, $t));
string(11) "13012345678"
int(1)
string(11) "13211113333"
int(1)
string(11) "13644444444"
int(0)
string(11) "136a4444224"
int(0)

夏之冰雪 2015-06-01
  • 打赏
  • 举报
回复
引用 7 楼 backnet 的回复:
[quote=引用 3 楼 hellodifa 的回复:]
<?php
$ar = array(
	'13012345678',
	'13211113333',
	'13644444444'
);

foreach($ar as $val)
{
	if(preg_match('/^1[3,5,8,7]\d(?!(\d)\\1{7})\d{8}/', $val))
	{
		echo $val . ' is ok.';
	}
	else
	{
		echo $val . ' is fail.';
	}
	echo '<br/>';
}
13012345678 is ok. 13211113333 is ok. 13644444444 is fail.
大神能详细讲一下这个正则的含义吗?[/quote] 正确的正则应该这样写 ^1[3587]\d(?!(\d)\\1{7})\d{8}? ^:表示开始, 1:以1开始 [3587]:3或者5或者8或者7 \d:匹配任意数字 (?!):这个是断言,断言后面不能怎么样 (\d)\\1{7}:表示匹配一个数字,捕获这个数字,并连续七次。最终意思表示,一个数字,重复八遍 (?!(\d)\\1{7}):断案后面不能用连续重复八次的相同的数字 \d{8}:匹配八位任意数字 ?:结尾 总结:以1开始,紧接着3587,然后接任意数字,断言之后没有重复八位的相同数字(注意断言不占用空间),匹配八位任意数字,结束。
backnet 2015-06-01
  • 打赏
  • 举报
回复
引用 3 楼 hellodifa 的回复:
<?php
$ar = array(
	'13012345678',
	'13211113333',
	'13644444444'
);

foreach($ar as $val)
{
	if(preg_match('/^1[3,5,8,7]\d(?!(\d)\\1{7})\d{8}/', $val))
	{
		echo $val . ' is ok.';
	}
	else
	{
		echo $val . ' is fail.';
	}
	echo '<br/>';
}
13012345678 is ok. 13211113333 is ok. 13644444444 is fail.
大神能详细讲一下这个正则的含义吗?
都市放牛郎 2015-06-01
  • 打赏
  • 举报
回复
谢谢各位大神

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧