信息采集前两个笑话的时候 是正常的 当采集到第三个笑话的时候就出错了 然后后面的全部都出错
Notice: Undefined offset: 21 in D:\wamp\www\xx.php on line 32<?php 
// 采集首页地址 
$url = "http://cn.jokes.yahoo.com/jok/index.html"; 
// 获取页面代码 
$r = file_get_contents($url); // 设置匹配正则 
$preg='/hspace=5><a href="http:\/\/cn\.jokes\.yahoo.com\/(.*).html" class=list target=_blank>/isU';
// 进行正则搜索 
preg_match_all($preg, $r, $title); // 计算标题数量 
$count = count($title[1]); 
// 通过标题数量进行内容采集 
for($i=0;$i<$count;$i++) { 
   // 设置内容页地址 
   $jurl = "http://cn.jokes.yahoo.com/". $title[1][$i].".html";
  
   // 获取内容页代码 
   $c = file_get_contents($jurl); 
   // 设置内容页匹配正则 
   $p = '/<div id="newscontent">(.*)<\/div>/isU'; 
      // 进行正则匹配搜索 
     preg_match($p,$c,$content); 
   // 输出标题 
  echo "<h1>".$title[1][$i]."</h1><br>";
  // 输出内容 
   echo $content[$i]; 
}
?>

解决方案 »

  1.   

    你的修饰符用的不正确
    //================================================================
    i :如果在修饰符中加上"i",则正则将会取消大小写敏感性,即"a"和"A" 是一样的。 
    m:默认的正则开始"^"和结束"$"只是对于正则字符串如果在修饰符中加上"m",那么开始和结束将会指字符串的每一行:每一行的开头就是"^",结尾就是"$"。 
    s:如果在修饰符中加入"s",那么默认的"."代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符! x:如果加上该修饰符,表达式中的空白字符将会被忽略,除非它已经被转义。 
    e:本修饰符仅仅对于replacement有用,代表在replacement中作为PHP代码。 
    A:如果使用这个修饰符,那么表达式必须是匹配的字符串中的开头部分。比如说"/a/A"匹配"abcd"。 
    E:与"m"相反,如果使用这个修饰符,那么"$"将匹配绝对字符串的结尾,而不是换行符前面,默认就打开了这个模式。 
    U:和问号的作用差不多,用于设置"贪婪模式"。
      

  2.   

    $count = count($title[0]); 
      

  3.   

    我明白了 我刚才看了一个技术文章http://kukuabc123.blog.163.com/blog/static/44458543200961704319461/
      

  4.   

    是这样的 $p = '/<div id="newscontent">(.*)<\/div>/isU';preg_match($p,$c,$content); 
     echo $content[0]; //返回全部括号()匹配成功的字符串  
     echo $content[1]; //返回第一个括号的()匹配成功的字符串   
    //  如果匹配表达式还有第二个括号 那么 $content[2]就是第二个括号匹配成功的字符串
    //如果在进行匹配 它不会把值继续想数组后面插入 而是重新覆盖数组  
      

  5.   

    在开始处加上
    error_reporting(E_ALL ^ E_NOTICE);