[英]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 片段 。
执行此操作时,将推断文档的其余部分。 如果您将配置保留为默认配置,并输出仅带有一段文本的整洁文档,您将看到未提供的DOCTYPE
, html
, head
和body
标签。 它推断出这些标签必须存在。
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.