PHP使用fsockopen获取的html内容要如何进行处理?

发布于 2022-09-12 03:41:05 字数 1205 浏览 20 评论 0

由于有个内网自定义hosts的接口,我为了避免DNS这一步,就采用了fsockopen的方式访问接口。
不过由于返回值是一串我不太理解的方式,比如:
4d8 {"code":1,"data":{"cate":"\u5e7d\u9ed8\u6545\u4e8b","title":"\u9152\u540e\u7684\u81ea\u4fe1","content":"\u63a8\u9500\u5458\u60f3\u4e86\u60f3\uff0c\u4e00\u8a00\u672a\u53d1\u5730\u51fa\u4e86\u5564\u9152\u9986\u300210\u5206\u949f\u540e\uff0c\u4ed6\u56de\u6765\u8fce\u6218\u3002<\/p>"}} 0
我不太理解头部类如4d8和尾部0这样的字符是表示什么的?
有没有比较高效的方式只取得大括号中的值。
PS:我目前采用的是笨方法,就是正则获得花括号中的值。

代码实现如下:

function remote_visit($ip, $host, $port, $url, $timeout){

    $errno = '';
    $errstr = '';

    $fp = fsockopen($ip, $port, $errno, $errstr, $timeout);

    if(!$fp){ // connect fail
        return false;
    }

    $out = "GET ${url} HTTP/1.1\r\n";
    $out .= "Host: ${host}\r\n";
    $out .= "Connection: close\r\n\r\n";
    fputs($fp, $out);

    $response = '';

    // 读取内容
    while($row=fread($fp, 4096)){
        $response .= $row;
    }

    fclose($fp);

    $pos = strpos($response, "\r\n\r\n");
    $response = substr($response, $pos+4);

//我现在采用了正则的方式取得里面的json部分,如下两行代码
    preg_match('@{(.*?)}@si',$response,$match);
    $response = '{'.$match[1].'}}';
    return $response;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文