打开网易查看源代码,可以看到其中有这样的一段话........
<!-- 新闻中心 Start -->
<div id="NewsCenter">
....................
</div>
<!-- 新闻中心 End -->
.......我只要新闻中间的部分.当然不是想要网易上的东东.因为业务需要,要获得某网站上提交之后的内容.

解决方案 »

  1.   

    真是奇怪。为什么[.\n]*不能匹配所有呢。JS手册上都是这么说的呀。
      

  2.   

    这是测试代码:
    <?php
    error_reporting(E_ALL);
    $contents='';function getTheTime(){ 
        $time = gettimeofday(); 
        return ((float)($time['usec']*0.000001) + (float)($time['sec'])); 
    }$startTime1=getTheTime();$handle = fopen ("http://www.163.com", "r");
    do {
        $data = str_replace("\n",'',fread($handle, 8192));
        if (strlen($data) == 0) {
            break;
        }
        $contents .= $data;
    } while(true);
    $temp1=preg_replace("/.+新闻中心 Start -->(.+)<\!-- 新闻中心 End.+/",'\1',$contents);
    fclose($handle);
    $endTime1=getTheTime();//echo $temp1;
    $startTime2=getTheTime();$handle = fopen ("http://www.163.com", "r");
    do {
        $data = fread($handle, 8192);
        if (strlen($data) == 0) {
            break;
        }
        $contents .= $data;
    } while(true);
    $temp2=substr($contents,strpos($contents,'<!-- 新闻中心 Start -->'));
    $temp2=substr($temp1,0,strpos($temp2,'<!-- 新闻中心 End -->'));
    fclose($handle);
    $endTime2=getTheTime();//echo $temp2;echo "<br>第一种方法(正则表达式)用时:",$endTime1-$startTime1,"<br>";
    echo "第二种方法(截取子字串)用时:",$endTime2-$startTime2,"<br>";?>
      

  3.   

    用 .*确实可以匹配所有,但不是包括回车,即\n用 [.\n] 匹配也不行。你可以用一个HTML的源代码,把它替换成空试一下。
      

  4.   

    .本来就不匹配\n的,手册里都说得很清楚了,用s模式 /.+/s
    直接搜索子串当然比正则快,str_replace就比preg_replace快很多
      

  5.   

    你的测试方法根本有问题,第二次得到的$contents是首页代码*2.
    而且你两次都用fopen()去取内容,影响结果的还有数据传输的因素.
    将你的测试代码改正后,你很容易就能看出结果:
    <?php
    error_reporting(E_ALL);
    $contents=file_get_contents('http://www.163.com');
    //echo htmlspecialchars($contents);
    function getTheTime(){ 
        $time = gettimeofday(); 
        return ((float)($time['usec']*0.000001) + (float)($time['sec'])); 
    }$startTime1=getTheTime();$temp1=preg_replace("/.+新闻中心 Start -->(.+)<\!-- 新闻中心 End.+/",'\1',$contents);$endTime1=getTheTime();//echo $temp1;
    $startTime2=getTheTime();$temp2=substr($contents,strpos($contents,'<!-- 新闻中心 Start -->'));
    $temp2=substr($temp1,0,strpos($temp2,'<!-- 新闻中心 End -->'));$endTime2=getTheTime();//echo $temp2;echo "<br/>第一种方法(正则表达式)用时:",$endTime1-$startTime1,"<br/>";
    echo "第二种方法(截取子字串)用时:",$endTime2-$startTime2,"<br/>";?>
      

  6.   

    另:使用file_get_contents()函数返回的是字串,根本不用去考虑什么换行符的问题.
    HTML代码而已,要不要换行符又有什么区别呢?
      

  7.   

    uGain说的不正确。file_get_contents()敢出来的仍然有换行。$temp1=preg_replace("/.+新闻中心 Start -->(.+)<\!-- 新闻中心 End.+/",'\1',$contents);这个正则表大式跟本不管用。找不到
      

  8.   

    重新写了个测试文件,看过后应该对正则匹配效率有更多了解.
    <?php
    error_reporting(E_ALL);
    echo '<pre>';
    $contents=file_get_contents('http://www.163.com');
    function getTheTime(){ 
        $time = gettimeofday(); 
        return ((float)($time['usec']*0.000001) + (float)($time['sec'])); 
    }
    $startTime1=getTheTime();
    $temp1=preg_replace('/.+新闻中心\sStart\s-->(.+)<\!--\s新闻中心\sEnd.+/s', '\1', $contents); 
    $endTime1=getTheTime();
    echo $temp1;
    $startTime2=getTheTime();
    preg_match('/新闻中心\sStart\s-->(.+)<\!--\s新闻中心\sEnd/s', $contents, $arr); 
    $endTime2=getTheTime();
    print_r($arr);
    $startTime3=getTheTime();
    $temp2=substr($contents,strpos($contents,'<!-- 新闻中心 Start -->'));
    $temp2=substr($temp2,0,strpos($temp2,'<!-- 新闻中心 End -->'));
    $endTime3=getTheTime();
    echo $temp2;
    echo "<br/>第一种方法(正则表达式 preg_replace)用时:",$endTime1-$startTime1;
    echo "<br/>第一种方法(正则表达式 preg_match)用时:",$endTime2-$startTime2;
    echo "<br/>第三种方法(截取子字串)用时:",$endTime3-$startTime3;
    ?>