php整洁奇怪的行为

CdB*_*CdB 4 html php tidy htmltidy

我正在使用php的整洁库来"清理和修复"来自用户输入的一些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;
Run Code Online (Sandbox Code Playgroud)

这适用于所有类型的输入,除非我正在尝试使用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>
Run Code Online (Sandbox Code Playgroud)

但是RepairString对它进行了条纹处理,并返回一个空字符串.
最奇怪的是: -
如果我输入一些文字以及上面的内容,那么输入就像Hello world<object...>...</object>它可以正常工作一样.
- 如果我指定'show-body-only' => false它也工作正常!

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

编辑:尝试了pankar的建议,将preserve-entities设置为true但没有运气...

Lei*_*igh 6

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

执行此操作时,将推断文档的其余部分.如果您离开配置为默认值,并输出一个整齐的文档只有一段文字,你会看到DOCTYPE,html,headbody标签,你没有给它.它推断出这些标签必须存在.

这里的问题是关于对象HTML规范声明:

OBJECT元素也可以出现在HEAD元素的内容中.

当推断出片段的位置时,它会将它放在可以发生的第一个位置.这意味着整洁将它放在head标签中.

之所以show-body-only影响你的输出,是因为你的片段没有被放入body.


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

在我看来,您可以选择的最佳选择是将所有代码片段注入"模板"文档,然后再将其解析出来.你可以很容易地做到这一点DOMDocument.

第二个解决方案是注入一个哨兵值,然后在仅显示身体时可以再次剥离.

____MY_MAGIC_TOKEN____
<object ...></object>
Run Code Online (Sandbox Code Playgroud)

之后你可以再把它剥掉.