2014-07-05 12 views
8

Ho un mucchio di documenti text/html che sto elaborandoCome rilevare entità html non valide in PHP?

Alcuni di essi contengono entità html codificate che sto cercando di convertire nei loro caratteri utf decodificati grezzi.

Questo è facile utilizzando html_entity_decode, tuttavia, alcuni dei soggetti non sono validi come

򙦙 

Per questo motivo sto usando un regexp per tirare fuori ogni singola entità, e poi cercando di convalidare le loro in qualche modo .

Se un'entità non è valido, voglio lasciarlo come 򙦙 nel documento, ma le cose come un codificato & sarebbe ancora diventare &.

Solo qualche codice di prova di esempio ho bussato fino ..

<?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); 

sto disegnando un po 'di vuoto il modo migliore per convalidare l'entità, piacerebbe qualche aiuto per favore.

risposta

2

alla fine ho trovato un modo ..

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; 
} 

Esecuzione di una stringa attraverso questo func convertirà tutte le entità valide ai loro caratteri UTF effettivi, lasciando tutti quelli non validi sinistra come entità