note 124877 added to domdocument.loadhtml

From: Date: Fri, 03 Apr 2020 08:30:59 +0000
Subject: note 124877 added to domdocument.loadhtml
Groups: php.notes 
Request: Send a blank email to php-notes+get-214410@lists.php.net to get a copy of this message
If you are loading html content from any website, in "utf-8" encoding, when meta width content-type is not first child of HEAD, it would not be acknowledged by parser (encoding); So you can make this fix: function domLoadHTML($html) {$testDOM = new DOMDocument('1.0', 'UTF-8'); $testDOM->loadHTML($html); $charset = NULL; $searchInElemnt = function(&$item) use (&$searchInElemnt, &$charset) {if($item->childNodes) {foreach($item->childNodes as $childItem) {switch($childItem->nodeName) {case 'html': case 'head': $searchInElemnt($childItem); break; case 'meta': $attributes = array(); foreach ($childItem->attributes as $attr) {$attributes[mb_strtoupper($attr->localName)] = $attr->nodeValue; } if(array_key_exists('HTTP-EQUIV', $attributes) && (mb_strtoupper($attributes['HTTP-EQUIV']) == 'CONTENT-TYPE') && array_key_exists('CONTENT', $attributes) && preg_match('~[\s]*;[\s]*charset[\s]*=[\s]*([^\s]+)~', $attributes['CONTENT'], $matches)) {$charset = preg_replace('~[\s\']~', '', $matches[1]); } } } } }; $searchInElemnt($testDOM); if(isset($charset)) {$dom = new DOMDocument('1.0', $charset); $dom->loadHTML('<?xml encoding="'.$charset.'">'.$html); foreach ($dom->childNodes as $item) if($item->nodeType == XML_PI_NODE) {$dom->removeChild($item); } $dom->encoding = $charset; } else {$dom = $testDOM; } return $dom; }; ---- Server IP: 45.112.84.4 Probable Submitter: 185.85.3.195 (proxied: 91.79.29.122) ---- Manual Page -- http://php.net/manual/en/domdocument.loadhtml.php Edit -- https://master.php.net/note/edit/124877 Del: integrated -- https://master.php.net/note/delete/124877/integrated Del: useless -- https://master.php.net/note/delete/124877/useless Del: bad code -- https://master.php.net/note/delete/124877/bad+code Del: spam -- https://master.php.net/note/delete/124877/spam Del: non-english -- https://master.php.net/note/delete/124877/non-english Del: in docs -- https://master.php.net/note/delete/124877/in+docs Del: other reasons-- https://master.php.net/note/delete/124877 Reject -- https://master.php.net/note/reject/124877 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#214410) next »