我正在处理一堆文本/ html文档
其中一些包含已编码的html实体,我试图将其转换为原始解码的utf字符。
使用html_entity_decode
很容易,但有些实体无效,例如
򙦙
出于这个原因,我正在使用正则表达式来提取每个单独的实体,然后尝试以某种方式验证它们。
如果实体无效,我希望将其作为򙦙
保留在文档中,但编码&
之类的内容仍会变为&
。
我敲了一些示例测试代码..
<?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 = "" & ͉ ’ 򙦙";
echo "<html><head><meta charset='UTF-8'></head><body>";
dump_chars($payload);
我对如何最好地验证实体感到有点空白,请给我一些帮助。
答案 0 :(得分:2)
我终于找到了办法......
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;
}
通过此func运行字符串会将所有有效实体转换为实际的utf字符,并将所有无效实体保留为实体