繁体   English   中英

php整洁奇怪的行为

[英]php tidy strange behaviour

我正在使用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;

这适用于所有类型的输入,除非我正在尝试使用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的建议,将preserve-entities设置为true但没有运气...

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

执行此操作时,将推断文档的其余部分。 如果您将配置保留为默认配置,并输出仅带有一段文本的整洁文档,您将看到未提供的DOCTYPEhtmlheadbody标签。 它推断出这些标签必须存在。

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

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

当推断出片段的位置时,它会将其置于可能出现的位置。 这意味着整洁将它放在head标签中。

show-body-only影响输出的原因是因为你的片段没有放在body


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

在我看来,您可以选择的最佳选择是将所有代码片段注入“模板”文档,然后再将其解析出来。 您可以使用DOMDocument轻松地完成此操作。

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

 ____MY_MAGIC_TOKEN____ <object ...></object> 

之后你可以再把它剥掉。

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

编辑

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

此设置实际上会忽略文档<head>中的所有内容。 <object>组件是<head>的子组件。 您只需指定即可验证

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

输出再次为空白。

您尝试将带前缀的文本放到<object>标签只是简单的诡计,因为它认为这些数据必须作为页面正文的一部分进行处理,从而进行显示。

希望这次能帮助更多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM