2011-01-23 14 views
11

Il codice seguente converte il testo per i caratteri con accenti. Ma converte anche i tag HTML che vorrei lasciare intatti. Come posso convertire solo caratteri accentati e lasciare intatti tutti gli altri caratteri speciali? Grazie.Converti gli accenti in HTML, ma ignora i tag

$temp = file_get_contents("file.html"); 
echo htmlentities($temp,ENT_NOQUOTES,'UTF-8'); 

risposta

21

htmlspecialchars() e htmlspecialchars_decode() sarà solo codificare/decodificare &, <, >, ' e "; si potrebbe quindi utilizzare questi ultimi per convertire i loro enti di nuovo ai loro HTML caratteri speciali:

echo htmlspecialchars_decode(htmlentities($temp, ENT_NOQUOTES, 'UTF-8'), ENT_NOQUOTES); 
+0

Questo funziona anche quando una su una pagina vengono utilizzate entrambe le entità codificate a strisciamento (ad esempio: entrambi '<' e '' <). Il rischio di conversione e di back-conversion istantanea è che, in alcuni casi, parti del testo originale potrebbero essere perse involontariamente. In questo caso, '<' si trasformerà in '<' e quindi ** tutte le occorrenze di '<' ** sono convertite in '<' di nuovo indietro, comprese tutte le occorrenze di '<' nel testo originale. Tuttavia, questo non è il caso, poiché anche il delimitatore dell'entità '&' stesso viene convertito! Quindi non devi preoccuparti della conversione non voluta del testo. Sembra abbastanza ovvio, ma lo ricordo. –

+1

soluzione eccellente, grazie – Codex73

1

A, ma di un hack, ma è possibile applicare htmlentities() come già fate in primo luogo, e poi invertire per la standard XML caratteri (<, >, &, ", ') utilizzando htmlspecialchars_decode(). Questo ripristinerà i tag.

0

Questo sembra funzionare bene

if (!function_exists('make_accents')): 
function make_accents($string) 
{ 
    //$string = "<p>Angoulême</p>"; 
    $trans = get_html_translation_table(HTML_ENTITIES); 
    //$encoded = "&lt;p&gt;Angoul&ecirc;me&lt;/p&gt;"; 
    $encoded = strtr($string, $trans); 
    //Next two lines put back the < & > tags 
     $noHTML = str_replace("&lt;", "<", $encoded); 
    $encoded = str_replace("&gt;", ">", $noHTML); 
    return $encoded; 
} 
endif; 
+0

Nel mio caso, il get_html_translation_table (HTML_ENTITIES); strtr ($ string, $ trans); era abbastanza per fare l'output diretto del mio contenuto. – Muffun