在一个表单里POST过来几个手机号码,在接收页里用正则对号码进行检查是否有效。奇怪的是,竟然只对最后一个有效果。 
反之,改用GET则没问题,百思不得其解,期待高人指点。 表单来的号码是换行方式的,如:
13926588888
13316888868
11926888888
13510688888
13802288888也就是说,按上面的示例手机号$_POST过来后它只能处理到最后一个号码即13802288888(本应是打印出4个号码的,因只有第三个号码是不符合规则的)。附上完整测试代码,请有环境的朋友帮忙检测一下,谢谢。<?php
//接收
if($_GET['action']=='send') {
$mobile = explode("\n",$_POST['mobile']);
//print_r($mobile); foreach ($mobile as $mobile_only){
if(preg_match("/^1(3|5|8)\d{9}$/",$mobile_only)) {
//处理
echo $mobile_only;
}
}
exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test</title>
</head>
<body><table width="98%" cellpadding="0" cellspacing="0" align="center">
<form method="post" name="formsms" action="?action=send">
<tr>
<td align="left">
<p>接收号码:一行一个手机号码.</p><textarea name="mobile" cols="25" rows="16"></textarea></td><td align="left">
<p>信息内容:</p><textarea name="sms_content" cols="42" rows="13"></textarea></td>
</tr><tr>
<td colspan="2"><input type="submit" value="提 交" /></td>
</tr>
</form>
</table></body>
</html>

解决方案 »

  1.   

    $mobile = explode("\n",$_POST['mobile']);
    换成:$mobile = preg_split("/\s+/",$_POST['mobile']);
    每行号码后面实际上还有\r,所以正则中数字后的$不匹配。
      

  2.   

    也可以只改$mobile = explode("\r\n",$_POST['mobile']);
    或者只改preg_match("/^1(3|5|8)\d{9}\r?$/",$mobile_only)
      

  3.   

    Array ( [0] => 13926588888 [1] => 13316888868 [2] => 11926888888 [3] => 13510688888 [4] => 13802288888 ) -------------------13926588888 13316888868 13510688888 
    这个是按楼上的测试结果 少了希望打出的 138开头的号码。。不知道怎么回事。是正则没写对吗? \d是什么意思呢?
      

  4.   

    if(preg_match("/^1(3|5|8)\d{9}$/",$mobile_only)) 改为if(preg_match("/^1(3|5|8)\d{9}$/",trim($mobile_only))) 
      

  5.   


    这样是报错的
    preg_match()里面用trim($mobile_only) 我这里打印不出来 我用$mobile_only= trim($mobile_only);
            if(preg_match("/^1(3|5|8)\d{9}\r$/",$mobile_only)) {
                //处理
                echo $mobile_only;
            }
    也不行 你那可以吗?
      

  6.   

    那么就可能是你的页面编码问题,如果你的文件保存为ansi格式,那么把下面这句改为
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    改为
    <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
      

  7.   

    if(preg_match("/^1(3|5|8)\d{9}$/",$mobile_only)) 
    改成这样preg_match("/^1[3|5|8]\d{8}/",$mobile_only)
      

  8.   

    又是$_GET['action' 又是$_POST['mobile']);
      

  9.   

    楼主的源代码确实是残碎的我是简单改了下 但是还是没打印出希望的结果。。
    if(preg_match("/^1(3|5|8)\d{9}$/",$mobile_only))
    改成这样preg_match("/^1[3|5|8]\d{8}/",$mobile_only) 
    这个方法貌似不行
      

  10.   

    6楼你可以说下这个trim方法的意义吗?为什么我的最后一个符合条件的号码打印不出来。
      

  11.   


    感谢你的热情,CSDN因有你们这些可爱的人而热闹...顺便回你,trim是去空格,7楼改的正则是不正确的,手机应为11位。