【php】解决DOM乱码的方法

本文介绍了一种使用PHP处理从网页抓取的内容时遇到的乱码问题及其解决方案。通过curl获取网页内容后,利用iconv和正则表达式进行字符集转换,确保DOM解析时的编码正确。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

获取网页代码头部信息:

    <meta charset="UTF-8">
    <title>全国大学英语四、六级考试官方成绩查询网站_中国高等教育学生信息网(学信网)</title>
    <meta name="keywords" content="四六级成绩,四六级查分,大学英语四六级"/>
    <meta name="description" content="教育部授权全国高等学校学生信息咨询与就业指导中心承担大学英语四、六级考试成绩网上查询及验证服务工作,并负责该工作运行过程中的大学英语四、六级考试成绩数据库管理与维护。"/>
    <link href='http://t3.chsi.com.cn/chsi/css/common2014.css' rel="stylesheet" type="text/css"/>

开始尝试使用iconv, mb函数将字符串转换成utf-8,没有效果,

PHP如何将字符串转换成utf-8编码?
// Fixes the encoding to uf8
function fixEncoding($in_str)
{
$cur_encoding = mb_detect_encoding($in_str) ;
if($cur_encoding == "UTF-8" && mb_check_encoding($in_str,"UTF-8"))
return $in_str;
else
return utf8_encode($in_str);
} // fixEncoding

使用utf8_encode函数检测是UTF-8编码,然后又修改了linux系统编码,任然是乱码。

然后找到了。

DOM是php比较新的xml和html处理类,可以像javascript那样方便的操作DOM树,网上更多的是介绍它处理XML的情况,今天这篇文章就介绍下php解决DOM乱码的方法,下面话不多说,直接看下面的解决方法。

解决方法如下

/**

 * 请求url页面信息

 * @param str $url

 * @return str mixed|boolean

 */

function curl_get($url) {

  $curl = curl_init();

  curl_setopt($curl, CURLOPT_URL, $url);

  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

  //302跳转

  curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);

  curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0');

  curl_setopt($curl, CURLOPT_REFERER, $url);

  $data = curl_exec($curl);

  $code = curl_getinfo($curl,CURLINFO_HTTP_CODE); //输出请求状态码

  curl_close($curl);

  if(200 == $code) {

    //解决乱码

    if (preg_match('#<meta[^>]*charset="?gb2312"[^>]*>#', $data)) {

      $data = iconv("gb2312","utf-8//IGNORE",$data);

      $data = preg_replace('#<meta[^>]*charset="?gb2312"[^>]*>#is', '<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">', $data);

    }

    if (!preg_match('#<meta charset="utf-8"[^>]*>#is', $data)) {

      $data = str_replace('<head>', '<head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">', $data);

    }

    if (preg_match('#<meta charset="utf-8"[^>]*>#is', $data)) {

      $data = preg_replace('#<meta charset="utf-8"[^>]*>#is', '<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">', $data);

    }



    return $data;

  } else {

    return false;

  }
}

/**

 * 获取 DOMDocument 对象

 * @param str $url

 * @return boolean|DOM

 */

function getDom($url) {

  $html_content = curl_get($url);

  if(empty($html_content)) {

    //saveLog($url, '请求失败');

    return false;

  }

  $dom = new DOMDocument('1.0', 'utf-8');

  libxml_use_internal_errors(true);

  $dom->loadHTML($html_content);

  return $dom;

}
$html_content = mb_convert_encoding($html_content, 'UTF-8', 'gb2312');

 

转载于:https://my.oschina.net/mickelfeng/blog/843460

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值