我目前正在尝试提供XHTML5.目前,我在正在处理的页面上提供XHTML 1.1 Strict.那就是我为有能力的浏览器所做的.对于那些不接受XML编码数据的人,我会严格遵循HTML4.1.
在尝试使用HTML5进行试验时,以HTML5格式交付时,所有功能或多或少都可以按预期工作.但是,作为XHTML5交付时,我遇到的第一个问题是HTML实体. FF4 sais& uuml;是未定义的实体.因为没有HTML5 DTD.
我了解到HTML5 wiki当前建议:
Do not use entity references in XHTML (except for the 5 predefined entities: &, <, >, " and ')
我确实需要& lt;& gt;在某些地方.因此,我的问题是,用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;
}
解决方法:
通用转换时要特别注意:使用带有默认参数的html_entity_decode不会删除all named entities,只有少数由旧的HTML 4.01标准定义.因此,& copy;(©)之类的实体将被转换;但有些人喜欢& plus((& plus;)).要转换所有命名的实体,请在第二个参数(!)中使用ENT_HTML5.
此外,如果目标编码不是UTF8,则无法接收上级(至255个)名称,例如& Ascr;(& Ascr;)则为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的知识.
标签:html5,php
来源: https://codeday.me/bug/20191208/2090196.html