strpos проблема: возвращаем значение UBLIC - PullRequest
1 голос
/ 22 декабря 2010

Я создаю класс для открытия веб-страницы и сохранения значений 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 ]

2 голосов
/ 22 декабря 2010

Вместо:

$start = $start + $beg;

try:

$start = $beg;

Вероятно, поэтому вы видите только первые три совпадения.

Кроме того, вам необходимо вставитьпроверка того, что $beg не является FALSE:

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

Обратите внимание, однако, что вы действительно должны использовать DOMDocument, чтобы найти все теги в документе с даннымимя тега (a здесь).В частности, поскольку это HTML, который может быть недопустимым XHTML, вам следует рассмотреть возможность использования метода loadHTML.

1 голос
/ 22 декабря 2010

Я думаю, у вас есть проблемы в вашей логике:

вы используете $ start, чтобы отметить место, где начать искать href, но результирующий $beg все равно будет индексом для полной строки. Поэтому, когда вы обновляете $start, добавляя $beg, вы получаете высокие значения. Вы должны попробовать $start = $beg + 1 вместо $start = $start + $beg

...