使用PHP删除除5个预定义HTML实体之外的所有实体的最佳方法 - 用于XHTML5输出

时间:2011-06-17 20:50:47

标签: php html5

我目前正在尝试提供XHTML5。目前我在我正在处理的页面上提供XHTML 1.1 Strict。这是我为有能力的浏览器做的。对于那些不接受XML编码数据的人,我又回到了HTML4.1 strict。

在尝试使用HTML5时,在以HTML5格式发布时,所有内容都或多或少地按预期工作。我作为XHTML5交付时遇到的第一个问题是HTML实体。 FF4 sais ü是一个未定义的实体。因为没有HTML5 DTD。

我读到HTML5 wiki目前建议:

  

不要在XHTML中使用实体引用(5个预定义实体除外:&<>"'

我在某些地方确实需要<>。因此,我的问题是PHP解码除上述五个实体之外的所有实体的最佳方法。 html_entity_decode()对所有这些进行解码,那么是否有合理的方法可以排除某些内容?

更新

我目前采用了简单的替换/替换方法,所以除非真的有一种优雅的方式,否则问题就能满足我的直接需求。

function non_html5_entity_decode($string)
{
    $string = str_replace("&",'@@@AMP',
                        str_replace("'",'@@@APOS',
                        str_replace("<",'@@@LT',
                        str_replace(">",'@@@GT',
                        str_replace(""",'@@@QUOT',$string)))));
    $string = html_entity_decode($string);
    $string = str_replace('@@@AMP',"&",
                        str_replace('@@@APOS',"'",
                        str_replace('@@@LT',"<",
                        str_replace('@@@GT',">",
                        str_replace('@@@QUOT',""",$string)))));
    return $string;
}

2 个答案:

答案 0 :(得分:3)

关于通用转换的

支持:使用默认参数的html_entity_decode不会删除all named entities,只会删除旧HTML 4.01标准中定义的少数参数。因此©(©)等实体将被转换;但有些像+(+),不是。要转换所有命名实体,请在第二个参数(!)中使用ENT_HTML5。

此外,如果目标编码不是UTF8,则无法重新接收上级(至255)名称,例如𝒜(?)thar是119964> 255.

因此,要转换“所有可能的命名实体”,您必须使用html_entity_decode($s,ENT_HTML5,'UTF-8') ,但它仅对PHP5.3 +有效,其中实现了ENT_HTML5标志。

在这个问题的特定情况下,必须使用标志ENT_NOQUOTES而不是默认的ENT_COMPAT,因此,必须使用html_entity_decode($s,ENT_HTML5|ENT_NOQUOTES,'UTF-8')


PS(已编辑):感谢@BoltClock记住PHP5.3 +。

答案 1 :(得分:0)

我认为html_entity_decode()后跟htmlspecialchars()是最简单的方法。

虽然不会转换' - 为此,您必须先htmlspecialchars(),然后将'转换为&apos