$m="-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707-261-385-519-698-707";
if(!preg_match("/^(\-\d+)*$/", $m))
{
     exit('aa');
}
exit('bb');
$m是用"-"分隔的数字字符串,用来存储客户浏览历史的,数字是ID,长度不确定。
当$m的长度比较短的时候,没有任何问题。
当客户浏览历史增加, $m的长度大慨超过1K的时候,无法返回结果
用httpwatch看提示错误ERROR_INTERNET_CONNECTION_RESET其他的解决办法也有,不过想知道是什么原因造成的。

解决方案 »

  1.   

    看不出,就算preg_match错误,会引起ERROR_INTERNET_CONNECTION_RESET你的$m串是如何存取的?
      

  2.   

    不了解PHP,也没有测试环境,楼主可以用以下的正则分别试下是否有同样的问题if(!preg_match("/^(\-\d++)*+$/", $m))
    //or
    if(!preg_match("/^(\-\d+)*+$/", $m))
    //or
    if(!preg_match("/^(\-\d++)*$/", $m))
      

  3.   

    1K的字符不能算长
    随随便便就可以达到昨天一个朋友测试了用ereg的方式就没有问题
    我想应该还是preg_match的问题这种字符串的验证应该很常见吧
    想知道原理和preg的解决方案
      

  4.   

    $m我是在COOKIE中取的,但是这个并不是cookie长度限制的原因
    $m在什么中取的也不重要,主要还是这个正则的问题
      

  5.   

    呵呵,emplode不好意思,搞错了哈哈
      

  6.   

    $m .= $m;
    $m .= $m;
    echo strlen($m);
    if(!preg_match("/^(\-\d+)*$/", $m))
    {
            exit('aa');
    }
    exit('bb');没有发现任何问题
      

  7.   

    奇怪的事,在win7上有问题,在winxp上没有问题
      

  8.   

    貌似跟“memory_limit”大小有关 UP UP
      

  9.   

    我这边是在win xp上面没有问题,其他操作系统我还没有测试
      

  10.   

    var_dump(preg_match_all("/^(\-\d+)*$/", $m ,$arr));
    print_r($arr);还有奇怪的,看看这个结果,子模式只有一个
      

  11.   

    应该问“为什么会出现这样的数据”。
    用explode后再来程序判断吧。
      

  12.   

    印象中好像只有非贪婪模式会出现这样的情况。
    你的php什么版本,php5.2以上支持两个pcre设置,如果在php.ini发现以下两个配置,配置大点的值试试[Pcre]
    ;PCRE library backtracking limit.
    ; http://php.net/pcre.backtrack-limit
    ;pcre.backtrack_limit=100000 ;PCRE library recursion limit.
    ;Please note that if you set this value to a high number you may consume all
    ;the available process stack and eventually crash PHP (due to reaching the
    ;stack size limit imposed by the Operating System).
    ; http://php.net/pcre.recursion-limit
    ;pcre.recursion_limit=100000