我目前正在尝试提供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;
}
答案 0 :(得分:3)
支持:使用默认参数的html_entity_decode
不会删除all named entities,只会删除旧HTML 4.01标准中定义的少数参数。因此©
(©)等实体将被转换;但有些像+
(+),不是。要转换所有命名实体,请在第二个参数(!)中使用ENT_HTML5。
此外,如果目标编码不是UTF8,则无法重新接收上级(至255)名称,例如𝒜
(?)thar是119964&gt; 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
。