strpos问题:获得价值UBLIC返回

时间:2010-12-22 16:13:52

标签: php strpos

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

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 个答案:

答案 0 :(得分:2)

而不是:

$start = $start + $beg;

尝试:

$start = $beg;

这可能就是为什么你只看到前三场比赛。

此外,您需要插入$beg不是FALSE的检查:

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

但请注意,您确实应该使用DOMDocument查找具有给定标记名称(此处为a)的文档中的所有标记。特别是,因为这是可能不是有效XHTML的HTML,所以您应该考虑使用loadHTML方法。

答案 1 :(得分:1)

我认为你的逻辑存在问题:

你使用$ start来标记开始寻找href的地方,但结果$beg仍然是完整字符串的索引。因此,当您通过添加$start更新$beg时,您会获得较高的值。您应该尝试$start = $beg + 1而不是$start = $start + $beg