2014-07-05 12 views
8

Ich habe eine Reihe von Text/HTML-Dokumenten, die ich verarbeiteWie erkennt man ungültige HTML-Entitäten in PHP?

Einige von ihnen enthalten kodierte HTML-Entities, die ich in ihre rohen entschlüsselten UTF-Zeichen zu konvertieren versuche.

Das ist einfach html_entity_decode verwenden, jedoch sind einige der Entitäten ungültig wie

򙦙 

Aus diesem Grunde einen regulären Ausdruck verwende ich jede einzelne Einheit zu ziehen, und dann irgendwie zu versuchen, sie zu validieren .

Wenn eine Entität ungültig ist, möchte ich es als 򙦙 im Dokument lassen, aber Dinge wie eine codierte & würde immer noch & werden.

Nur ein paar Probe-Test-Code I knocked up ..

<?php 
function dump_chars($s) 
{ 
    if (preg_match_all('/&[#A-Za-z0-9]+;/', $s, $matches)) 
    { 
     foreach ($matches[0] as $m) 
     { 
      $decoded = html_entity_decode($m, ENT_QUOTES, "UTF-8"); 

      echo "[" . htmlentities($m, ENT_QUOTES, "UTF-8") . "] "; 
      echo "Decoded: [" . $decoded . "] "; 
      echo "Hex: [" . bin2hex($decoded) . "] "; 
      echo "detect: [" . mb_detect_encoding($decoded) . "]"; 
      echo "<br>"; 
     } 
    } 
} 

$payload = "&quot; &amp; &#x349; &#x92; &#x99999;"; 
echo "<html><head><meta charset='UTF-8'></head><body>"; 
dump_chars($payload); 

Ich bin ein bisschen eine leere Zeichnung wie man am besten an das Unternehmen zu überprüfen, würde etwas Hilfe lieben, gefallen.

Antwort

2

ich schließlich einen Weg gefunden ..

function decode_numeric_entities($s) 
{ 
    $result = $s; 
    $convmap = array(0x0, 0x2FFFF, 0, 0xFFFF); 

    if (preg_match_all('/&[#A-Za-z0-9]+;/', $s, $matches)) 
    { 
     foreach ($matches[0] as $m) 
     { 
      $decoded = mb_decode_numericentity($m, $convmap, 'UTF-8'); 
      $result = str_replace($m, $decoded, $result); 
     } 
    } 
    return $result; 
} 

eine Schnur durch diese func ausführen, werden alle gültigen Einheiten ihrer tatsächlichen utf Zeichen umwandeln, alle ungültigen diejenigen als Entitäten links verlassen

Verwandte Themen