2010-12-22 78 views
1

我正在创建一个类来打开网页并存储页面上所有出站链接的href值。由于某种原因,它适用于前3然后变得更加奇怪。以下是我的代码:strpos问题:获得价值UBLIC返回

class Crawler { 
var $url; 

function construct($url) { 
    $this->url = 'http://'.$url; 
    $this->crawl(); 
} 

function crawl() { 
    $str = file_get_contents($this->url); 
    $start = 0; 
    for($i=0; $i<10; $i++) { 
     $beg = strpos($str, '<a href="http://',$start)+16; 
     $end = strpos($str,'"',$beg); 
     $diff = $end - $beg; 
     $links[$i] = substr($str,$beg, $diff); 
     $start = $start + $beg; 
    } 
    print_r($links); 
} 
} 

$crawler = new Crawler; 
$crawler->construct('www.yahoo.com'); 

忽略for循环暂时我知道这只会返回前10个,不会执行整个文档。但是如果你运行这个代码,前3个工作正常,但其他所有值都是UBLIC。 任何人都可以帮忙吗?由于

回答

2

相反的:

$start = $start + $beg; 

尝试:

$start = $beg; 

这很可能为什么你只看到了前三次比赛。

此外,您还需要插入检查$begFALSE

for($i=0; $i<10; $i++) { 
    $beg = strpos($str, '<a href="http://',$start)+16; 
    if ($beg === FALSE) 
     break; 
    //... 

但是请注意,你真的应该使用DOMDocument找到一个给定标记名称的文档中的所有标签(a这里)。特别是,因为这是可能不是有效的XHTML的HTML,所以应该考虑使用loadHTML方法。

1

我觉得你有你的逻辑存在问题:

您使用$开始,以纪念从哪里开始寻找在href的地方,但由此产生的$beg仍将是一个索引完整的字符串。所以当你通过加入$beg更新$start时,你会得到很高的价值。您应该尝试$start = $beg + 1而不是$start = $start + $beg