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但没有运气...
问题是您正在尝试处理HTML 片段.
执行此操作时,将推断文档的其余部分.如果您离开配置为默认值,并输出一个整齐的文档只有一段文字,你会看到DOCTYPE,html,head和body标签,你没有给它.它推断出这些标签必须存在.
OBJECT元素也可以出现在HEAD元素的内容中.
当推断出片段的位置时,它会将它放在可以发生的第一个位置.这意味着整洁将它放在head标签中.
之所以show-body-only影响你的输出,是因为你的片段没有被放入body.
body代码.这是因为原始文本是不允许的head标签.因此,片段的逻辑推断位置在body.
在我看来,您可以选择的最佳选择是将所有代码片段注入"模板"文档,然后再将其解析出来.你可以很容易地做到这一点DOMDocument.
第二个解决方案是注入一个哨兵值,然后在仅显示身体时可以再次剥离.
即
____MY_MAGIC_TOKEN____
<object ...></object>
Run Code Online (Sandbox Code Playgroud)
之后你可以再把它剥掉.