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