note 124877 added to domdocument.loadhtml
| From: | BychkovVV.mail.ru via php-notes | 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