웹페이지 소스를 파싱하는 클래스입니다.
url과 정규식을 입력하면 파싱결과를 뱉어줍니다.
curl을 사용하였기 때문에 fopen과 달리 PHP설정이 allow_url_fopen Off 가 되어 있어도 작동을 합니다.
<클래스 소스>
patterns = array();
$this->buffer = '';
$this->http_code = 0;
$this->cookie_file = 'cookie.txt';
}
/**
* @bref url 세팅
* @param string URL
**/
public function setUrl($url){
$this->url = $url;
}
/**
* @bref 2014.01.28 추가 - REFERER 세팅 : refer없으면 내용이 안나오는 사이트가 있음
* @param string URL
**/
public function setRefer($refer){
$this->refer = $refer;
}
/**
* @bref 패턴과 파싱결과의 row, col 세팅
* @param string 패턴
**/
public function addPattern($pattern){
$this->patterns[] = $pattern;
}
/**
* @bref 쿠키파일을 지정한다
* @param string
**/
public function setCookieFile($filepath){
$this->cookie_file = $filepath;
}
/**
* @bref 지정한 url의 컨텐츠를 불러들인다
**/
private function loadContent(){
//$agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)';
$agent = 'Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0';
$curlsession = curl_init();
curl_setopt ($curlsession, CURLOPT_URL, $this->url);
curl_setopt ($curlsession, CURLOPT_HEADER, 1);
//http 응답코드가 302일때 redirect_url 로 따라감
curl_setopt ($curlsession, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt ($curlsession, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($curlsession, CURLOPT_POST, 0);
curl_setopt ($curlsession, CURLOPT_USERAGENT, $agent);
curl_setopt ($curlsession, CURLOPT_REFERER, $this->refer);
curl_setopt ($curlsession, CURLOPT_TIMEOUT, 3);
curl_setopt ($curlsession, CURLOPT_COOKIEJAR, $this->cookie_file);
curl_setopt ($curlsession, CURLOPT_COOKIEFILE, $this->cookie_file);
$this->buffer = curl_exec ($curlsession);
$cinfo = curl_getinfo($curlsession);
$this->http_code = $cinfo['http_code'];
curl_close($curlsession);
if ($this->http_code != 200) {
$this->buffer = '';
}
}
/**
* @bref 결과를 리턴한다
* @return array 모든 결과가 담긴 배열
**/
public function getResult(){
$result = array();
$this->loadContent();
foreach($this->patterns as $item){
$result[] = $this->getParseResult($item);
}
return $result;
}
/**
* @bref 파싱
* @param string 패턴
* @return array 하나의 정규식에 대한 파싱 결과가 담긴 배열
**/
private function getParseResult($pattern){
$result = array();
preg_match_all($pattern, $this->buffer, $matches);
//첫번째 요소는 날린다
if(count($matches) > 0) array_splice($matches, 0, 1);
return $matches;
}
}
<사용 예제>
//daum.net 의 이미지src와 a태그의 글자를 뽑아와 봅시다
$url = 'http://www.daum.net';
if($url != ''){
$iup = new HTMLParser();
$iup->setUrl($url);
//refer가 필요할 경우
//$iup->setRefer('http://www.daum.net');
//cookie 파일을 지정한다(변경이 필요한 경우)
//$iup->setCookieFile('cookie.txt');
//이미지태그의 src를 추출한다
$iup->addPattern('/]*src=["']?([^>"']+)["']?[^>]*>/');
//소스에 존재하지 않는 패턴의 결과를 보여주기 위한것(아무것도 안나옴)
$iup->addPattern('/ddd/');
//a 태그의 텍스트 내용을 추출한다
$iup->addPattern('/]*>([^<]+)<\/a>/');
//파싱결과를 돌려줌
$result = $iup->getResult();
//결과를 보기좋게 출력
echo '';
print_r($result);
echo '
';
}
읽어주셔서 감사합니다.