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

使用PHP删除除5个预定义HTML实体之外的所有HTML实体的最佳方法-用于XHTML5输出,php,html,Php,Html,我目前正在尝试交付XHTML5。目前,我在正在开发的页面上提供了XHTML1.1。这就是我对有能力的浏览器所做的。对于那些不接受XML编码数据的人,我会回到HTML4.1 在使用HTML5进行试验时,当作为HTML5交付时,所有的工作或多或少都如预期的那样。但是,当作为XHTML5交付时,我遇到的第一个问题是HTML实体。FF4 saisü;是一个未定义的实体。因为没有HTML5 DTD 我读到HTML5目前建议: 请勿在XHTML中使用实体引用,但5个预定义实体除外:&,和&ap

我目前正在尝试交付XHTML5。目前,我在正在开发的页面上提供了XHTML1.1。这就是我对有能力的浏览器所做的。对于那些不接受XML编码数据的人,我会回到HTML4.1

在使用HTML5进行试验时,当作为HTML5交付时,所有的工作或多或少都如预期的那样。但是,当作为XHTML5交付时,我遇到的第一个问题是HTML实体。FF4 saisü;是一个未定义的实体。因为没有HTML5 DTD

我读到HTML5目前建议:

请勿在XHTML中使用实体引用,但5个预定义实体除外:&,和&apos

我确实需要,在某些地方。因此,我的问题是,除了上面提到的五个实体之外,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_实体_解码后再加上a是最简单的方法

它不会转换'不过,要做到这一点,你必须先做htmlspecialchars,然后再转换&039;进入&apos

注意通用转换:使用带有默认参数的html_实体_解码不会删除,只有旧html 4.01标准定义的少数几个。因此,像©;©将由转换后的;但有些人喜欢&plus&加不要转换所有命名实体,请在第二个参数中使用ENT_HTML5

此外,如果目标编码不是UTF8,则无法接收超过255个名称,如&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+。

这对我不起作用。我使用的是输出缓冲区,我想在最后得到缓冲区的内容并进行替换。如果我使用htmlspecialchars,我会对所有源代码进行编码。我希望将这些实体保留在它们已经存在的地方。感谢您的帮助,请参阅上面我最终用于测试XHTML5输出的内容。您的答案对于来自数据库等的数据是合理的,所以我接受它。这个建议并不能解决问题。参见htmlspecialchars&123&;,好的,将保留&;,但摧毁&123;,当然,ENT_HTML5只在PHP5.4中可用,在第一次提出这个问题时,PHP5.4甚至都不可用。如果您仍然使用较旧版本的PHP,那么您必须找到一个解决方法。对不起,我现在发现了,经过错误和测试。。。好吧,我不会删除,因为现在页面有一个明确的解决方案,像我这样的快速读者。谢谢@BoltClock。没关系——这个答案可能对未来的读者有所帮助。我只是说这个功能相对较新,所以它可能不会让某些人受益。这个项目的服务器还不是PHP5.3,但让我们展望未来。感谢您恢复这一版本。正如@BoltClock所记得的,在PHP5.4+的情况下,问题的一部分会随着entu HTML5的标志消失。请参阅和