phpQueryでShift_JISのHTMLファイルがパースできない
特殊なページなのか、単純にShift_jISがダメなのか・・・
作成日:2018-02-22, 更新日:2020-10-26
めもとサンプル
phpQueryでパースしていたら一部文字化けする。
調べると「Shift_Jis」のページだった。
DOMに変換する前に「mb_convert_encoding()」で「UTF-8」に変換していたけど各要素を取得すると文字化けを起こす。
あれこれ試して気付いたのがHTMLタグの文字コード指定。
コイツも「UTF-8」に変換してあげないとダメっぽい。
そういえば、随分前に「phpQueryはUTF8じゃないとダメ」というような結論に達したような・・・そんな記憶がある。
▼取得したソースをUTF-8にして、HTMLタグの文字コードも変換させてからパースさせる。
function preparePHPQuery($str){ $toCc = 'UTF-8'; // ▼文字コードを「UTF-8」に変換 $charArys = array('UTF-8', 'eucJP-win', 'SJIS-win', 'ASCII', 'EUC-JP', 'SJIS', 'JIS'); $cc = mb_detect_encoding($str, $charArys); // 1回、SJIS-winに置きかえないとダメとか言うけど・・・未調査のためコメントにしておく // $str = mb_convert_encoding($str, 'SJIS-win', $cc); // $str = mb_convert_encoding($str, $toCc, 'SJIS-win'); $str = mb_convert_encoding($str, $toCc, $cc); // ▲文字コードを「UTF-8」に変換 // ▼HTMLタグの文字コード指定を「UTF-8」に変換 $reg = '/<meta .*charset.*=(.+)[\";].*?>/iu'; if ( preg_match($reg, $str, $m) ) { $str = str_replace($m[1], $toCc, $str); } // ▲HTMLタグの文字コード指定を「UTF-8」に変換 return $str; } $path = 〇〇〇; $tmpData = @file_get_contents($path); $data = preparePHPQuery($tmpData); $dom = phpQuery::newDocumentHTML($data);