2017-03-05 1 views
1

Eine verwandte Frage ist Preventing DOMDocument::loadHTML() from converting entities, aber es ergab keine Lösung.DOMDocument: loadHTML() konvertiert htmlentities

Dieser Code:

$html = "<span>&#x1F183;&#x1F174;&#x1F182;&#x1F183;</span>"; 
$doc = new DOMDocument; 
$doc->resolveExternals = false; 
$doc->substituteEntities = false; 
$doc->loadhtml($html); 
foreach ($doc->getElementsByTagName('span') as $node) 
{ 
    var_dump($node->nodeValue); 
    var_dump(htmlentities($node->nodeValue)); 
    var_dump(htmlentities(iconv('UTF-8', 'ISO-8859-1', $node->nodeValue))); 
} 

Erzeugt HTML:

string(16) "" 
string(16) "" 
string(0) "" 

Aber was ich will, ist &#x1F183;&#x1F174;&#x1F182;&#x1F183;

Ich bin mit PHP Version 5.6.29 und ini_get("default_charset") kehrt UTF-8

Antwort

0

Nach dem Lesen mehr auf http://php.net/manual/en/function.htmlentities.php Ich bemerkte, dass es nicht alle Unicode codiert. Jemand schrieb superentities in den Kommentaren, aber diese Funktion scheint für mich nicht zu funktionieren. Die UTF8entities Funktion hat.

Hier sind zwei Funktionen, die ich aus dem Kommentarbereich und dem Code geändert habe, obwohl nicht genau das, was ich wollte, gibt es HTML-codierte Werte.

$html = "<span>&#x1F183;&#x1F174;&#x1F182;&#x1F183;</span>"; 
$doc = new DOMDocument; 
$doc->resolveExternals = false; 
$doc->substituteEntities = false; 
$doc->loadhtml($html); 
foreach ($doc->getElementsByTagName('span') as $node) 
{ 
    var_dump(UTF8entities($node->nodeValue)); 
} 


function UTF8entities($content="") {   
    $characterArray = preg_split('/(?<!^)(?!$)/u', $content); // return array of every multi-byte character 
    foreach ($characterArray as $character) { 
     $rv .= unicode_entity_replace($character); 
    } 
    return $rv; 
} 

function unicode_entity_replace($c) { //m. perez 
    $h = ord($c{0});  
    if ($h <= 0x7F) { 
     return $c; 
    } else if ($h < 0xC2) { 
     return $c; 
    } 

    if ($h <= 0xDF) { 
     $h = ($h & 0x1F) << 6 | (ord($c{1}) & 0x3F); 
     $h = "&#" . $h . ";"; 
     return $h; 
    } else if ($h <= 0xEF) { 
     $h = ($h & 0x0F) << 12 | (ord($c{1}) & 0x3F) << 6 | (ord($c{2}) & 0x3F); 
     $h = "&#" . $h . ";"; 
     return $h; 
    } else if ($h <= 0xF4) { 
     $h = ($h & 0x0F) << 18 | (ord($c{1}) & 0x3F) << 12 | (ord($c{2}) & 0x3F) << 6 | (ord($c{3}) & 0x3F); 
     $h = "&#" . $h . ";"; 
     return $h; 
    } 
} 

gibt diese:

string(36) "&#127363;&#127348;&#127362;&#127363;"

Verwandte Themen