테스트 사이트 - 개발 중인 베타 버전입니다

네이버 환율 파싱 채택완료

delpino 7년 전 조회 6,504

네이버 환율 파싱 소스를 https://sir.kr/cm_free/1350194">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개

채택된 답변
+20 포인트
7년 전

</p>

<p>function Ncurrency($items) { 

    $Data = array();</p>

<p>    # 데이터 호출

    $url = '<a href="https://finance.naver.com/marketindex/exchangeList.nhn';" target="_blank" rel="noopener noreferrer">https://finance.naver.com/marketindex/exchangeList.nhn';</a>

    $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;</p>

<p>     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];</p>

<p>     }

 

     return $Data;

 }

 $items = array('통화명', '매매기준율', '현찰살때', '현찰팔때', '송금보낼때', '송금받을때', '미화환산율');

 $Data = Ncurrency($items);</p>

<p>$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>';</p>

<p>

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

d
delpino
7년 전
감사합니다...도움이 되었습니다....
답변 참고하여 원소스를 약간 변형하니 이상없이 잘 작동되고 있습니다...

다시한번 도움 감사드립니다....몇일을 고생했는데.....덕분에 잘 해결하였습니다..
주니어
6년 전
저도 덕분에 많은 도움이 되었습니다.
질문자님도 답변자님도 모두 고맙습니다...

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인