【问题标题】:How to detect invalid html entities in PHP?如何在 PHP 中检测无效的 html 实体?
【发布时间】:2014-07-05 23:14:05
【问题描述】:

我正在处理一堆文本/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 = "&quot; &amp; &#x349; &#x92; &#x99999;";
echo "<html><head><meta charset='UTF-8'></head><body>";
dump_chars($payload);

我正在画一个空白如何最好地验证实体,希望得到一些帮助。

【问题讨论】:

    标签: php html-entities iconv


    【解决方案1】:

    我终于找到了办法..

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

    通过这个函数运行一个字符串会将所有有效实体转换为其实际的utf字符,将所有无效实体保留为实体

    【讨论】:

      猜你喜欢
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多