4

我正在使用 php 的 tidy 库来“清理和修复”来自用户输入的一些 html。

一切正常,但我遇到了一个问题,我无法弄清楚它的原因是什么。我的代码是这样的:

$tidy = new tidy();

    $tidy_options = array(
        'hide-comments' => true,'tidy-mark' => false, 'indent' => false,
        'new-blocklevel-tags' => 'article,footer,header,hgroup,output,progress,section,video',
        'new-inline-tags' => 'audio,details,time,ruby,rt,rp',
        'drop-empty-paras' => false, 
        'doctype' => '<!DOCTYPE HTML>',
        'sort-attributes' => 'none', 'vertical-space' => false,
        'output-xhtml' => true,'wrap' => 180,
        'wrap-attributes' => false,
        'break-before-br' => false,
        'show-body-only' => true
        );
$data = $tidy->repairString($data, $tidy_options, 'UTF8');
echo $data;

这适用于所有类型的输入,除非我尝试使用 html 嵌入 swf 文件。
所以,我试试这个代码:

<object data="http://the_swf_file_url" type="application/x-shockwave-flash" width="853" height="520"> 
    <param name="movie" value="http://the_swf_file_url"> 
</object>

但是 repairString 将其全部删除,并返回一个空字符串。
最奇怪的是: -
如果我在上面输入了一些文本,那么输入就像Hello world<object...>...</object>然后它工作正常。
- 或者,如果我指定'show-body-only' => false它也可以正常工作!

任何线索为什么会这样?提前致谢。

编辑:尝试了 pankar 的建议,将保留实体设置为 true,但没有运气......

4

2 回答 2

6

问题是您正在尝试处理 HTML片段

执行此操作时,将推断文档的其余部分。如果您将配置保留为默认值,并输出一个仅包含一段文本的整洁文档,您将看到您没有提供的、和DOCTYPE标签html。它推断这些标签必须存在。headbody

这里的问题是关于对象的 HTML 规范指出:

OBJECT 元素也可能出现在 HEAD 元素的内容中。

当你的片段的位置被推断出来时,它会把它放在它可能发生的第一位。这意味着 tidy 会将其放在head标签中。

影响您的输出的原因show-body-only是因为您的片段没有被放置在body.


但是,当您添加一些文本时,它会强制您的代码段进入body标签。这是因为标签中不允许使用原始文本。head因此,您的片段的逻辑推断位置位于body.

在我看来,您可用的最佳选择是将所有代码片段注入“模板”文档,然后再将它们解析出来。您可以使用DOMDocument.

第二种解决方案是注入一个标记值,之后您可以在仅显示主体时再次删除该值。

IE

____MY_MAGIC_TOKEN____
<object ...></object>

然后你可以在之后再次将其剥离。

于 2012-08-02T10:54:35.963 回答
3

尝试将配置选项指定preserve-entitiestrue(默认为false)。

编辑

秒(更彻底)的想法。这是预期的行为。通过设置show-body-onlytrue告诉输出已处理文档tidy的正文部分。xhtml

此设置实际上会忽略<head>文档中的所有内容。<object>组件是<head>. 您可以通过简单地指定来验证这一点

$data = "<title>My Site</title>".

输出再次为空白。

您尝试将前缀文本添加到<object>标记中只是简单地欺骗了整洁,因为它认为必须将这些数据作为页面正文的一部分进行处理,然后才能显示出来。

希望这次能有更多帮助。

于 2012-07-26T13:28:38.523 回答