Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php strpos问题:获取返回的值public_Php_Strpos - Fatal编程技术网

Php strpos问题:获取返回的值public

Php strpos问题:获取返回的值public,php,strpos,Php,Strpos,我正在制作一个类来打开一个网页,并在页面上存储所有出站链接的href值。出于某种原因,它适用于前3个,然后变为wierd。下面是我的代码: class Crawler { var $url; function construct($url) { $this->url = 'http://'.$url; $this->crawl(); } function crawl() { $str = file_get_contents($this->url);

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

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');
类爬虫{
var$url;
函数构造($url){
$this->url='http://'。$url;
$this->crawl();
}
函数爬网(){
$str=file\u get\u contents($this->url);
$start=0;
对于($i=0;$iconstruct('www.yahoo.com');
暂时忽略for循环我知道这只会返回前10个,不会完成整个文档。但是如果运行此代码,前3个可以正常工作,但其他所有值都是public。 有人能帮忙吗?谢谢,而不是:

$start = $start + $beg;
尝试:

这可能就是你只看到前三场比赛的原因

此外,您还需要插入一个检查,确保
$beg
不是
FALSE

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

对于($i=0;$i我认为您的逻辑有问题:

您使用$start标记开始查找href的位置,但生成的
$beg
仍将是完整字符串的索引。因此,当您通过添加
$beg
来更新
$start
时,会得到较高的值。您应该尝试
$start=$beg+1
而不是
$start=$start+$beg

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