ラボ > PHP:HTML、Javascript絡み、ファイル関連、DOM関連

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);