2010-12-22 5 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'); 

가 무시 나는이 첫 번째 (10)을 반환하고 전체 문서를하지 않을 것이다 알고 당분간 루프. 하지만이 코드를 실행하면 처음 세 가지가 작동하지만 다른 모든 값은 UBLIC입니다. 아무도 도와 줄 수 있습니까? 감사합니다

대신

답변

2

:

$start = $start + $beg; 

시도 : 당신이 첫 번째 3 경기를보고있는 이유는 가능성이 높습니다

$start = $beg; 

. 그러나,

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

주 당신이 정말로 (a를 주어진 태그 이름을 가진 문서의 모든 태그를 찾을 DOMDocument을 사용하는 것을 : $begFALSE 아니라고

또한, 당신은 수표를 삽입해야 이리). 특히 이것은 유효한 XHTML이 아닌 HTML이기 때문에 loadHTML 메소드 사용을 고려해야합니다.

1

나는 당신이 당신의 논리에 문제가 있다고 생각 : 당신이 $ href를 찾고 시작하는 위치를 표시하기 시작 사용하십시오

을하지만, 그 결과 $beg은 여전히 ​​전체 문자열에 대한 인덱스 될 것입니다. 따라서 $beg을 추가하여 $start을 업데이트하면 높은 값을 얻게됩니다. $start = $start + $beg

대신 $start = $beg + 1을 입력해야합니다.
관련 문제