네이버 환율 파싱
본문
네이버 환율 파싱 소스를 https://sir.kr/cm_free/1350194에서 참고하여
<?php
function Ncurrency() {
# 데이터 호출
$url = 'https://finance.naver.com/marketindex/exchangeList.nhn';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$res = iconv('euc-kr', 'UTF-8', $response); if(!$response) return 'false';
# 파싱
preg_match("/<tbody.*?>.*?<\/[\s]*tbody>/s", $res, $tbody); if(!is_array($tbody)) return 'false';
preg_match_all('`<tr.*?>(.*?)<\/[\s]*tr>`s', $tbody[0], $tr); if(!is_array($tr)) return 'false';
$Data = array();
foreach($tr[0] as $k=>$v) {
unset($td, $akey);
preg_match_all('`<td.*?>(.*?)<\/td>`s', $v, $td);
$td = $td[0];
$akey = preg_replace('/([\xEA-\xED][\x80-\xBF]{2})+/', '', strip_tags($td[0]));
$akey = trim(str_replace('JPY (100)', 'JPY', $akey));
$akey = trim(str_replace('100', '', $akey)); if(!$akey) return 'false';
$Data[$akey]['통화명'] = trim(strip_tags($td[0]));
$Data[$akey]['매매기준율'] = str_replace(',', '', trim(strip_tags($td[1])));
$Data[$akey]['현찰살때'] = str_replace(',', '', trim(strip_tags($td[2])));
$Data[$akey]['현찰팔때'] = str_replace(',', '', trim(strip_tags($td[3])));
$Data[$akey]['송금보낼때'] = str_replace(',', '', trim(strip_tags($td[4])));
$Data[$akey]['송금받을때'] = str_replace(',', '', trim(strip_tags($td[5])));
$Data[$akey]['미화환산율'] = str_replace(',', '', trim(strip_tags($td[6])));
}
return $Data;
}
$Data = Ncurrency();
?>
과 같이 작성하였습니다...
문제는 웹호스팅(카페24 이용 중)에 업로드 하였을 때는 환율정보가 잘 나옵니다...그런데 내부서버(오토셋 10.7.2)로 업로드하면
Warning: Illegal string offset 'USD' in 파일주소 on line 59
Warning: Illegal string offset '통화명' in 파일주소 on line 59
로 나옵니다...
어찌 수정을 해야하는 것인가요???ㅠㅠ
답변 1
function Ncurrency($items) {
$Data = array();
# 데이터 호출
$url = 'https://finance.naver.com/marketindex/exchangeList.nhn';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$response = curl_exec($ch);
curl_close($ch);
if(!$response) return $Data;
$res = iconv('euc-kr', 'UTF-8', $response);
# 파싱
preg_match('#<tbody.*?>.*?</tbody>#s', $res, $tbody); if(!$tbody) return $Data;
preg_match_all('#<tr.*?>(.*?)</tr>#s', $tbody[0], $tr); if(!$tr) return $Data;
foreach($tr[1] as $v) {
preg_match_all('#<td.*?>(.*?)</td>#s', $v, $td);
$td = $td[1];
$td[0] = preg_replace('#^\s+|\s+$#s', '', strip_tags($td[0]));
$akey = preg_replace('#[^A-Z]+#s', '', $td[0]); if(!$akey) return $Data;
for ($i=0; $i<count($items); $i++)
$Data[$akey][$items[$i]] = $td[$i];
}
return $Data;
}
$items = array('통화명', '매매기준율', '현찰살때', '현찰팔때', '송금보낼때', '송금받을때', '미화환산율');
$Data = Ncurrency($items);
$html = '<table border=1><tr>';
foreach ($items as $v)
$html .= "<th>$v</th>";
$html .= '</tr>';
foreach ($Data as $k => $v) {
$html .= '<tr>';
foreach ($items as $v1)
$html .= "<td>{$Data[$k][$v1]}</td>";
$html .= '</tr>';
}
echo $html . '</table>';