Php 他有奇怪的行为
我正在使用php的tidy库来“清理和修复”来自用户输入的一些html 一切正常,但我遇到了一个问题,我不知道它的原因是什么。我的代码如下:Php 他有奇怪的行为,php,html,tidy,htmltidy,Php,Html,Tidy,Htmltidy,我正在使用php的tidy库来“清理和修复”来自用户输入的一些html 一切正常,但我遇到了一个问题,我不知道它的原因是什么。我的代码如下: $tidy = new tidy(); $tidy_options = array( 'hide-comments' => true,'tidy-mark' => false, 'indent' => false, 'new-blocklevel-tags' => 'article,foot
$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;
$tidy=new tidy();
$tidy_options=数组(
'隐藏注释'=>true,'tidy-mark'=>false,'indent'=>false,
“新区块级别标记”=>“文章、页脚、页眉、hgroup、输出、进度、部分、视频”,
'新的内联标签'=>'音频、详细信息、时间、ruby、rt、rp',
“删除空段落”=>false,
“doctype'=>”,
'排序属性'=>'无','垂直空格'=>false,
'output xhtml'=>true,'wrap'=>180,
“包装属性”=>false,
'在br之前中断'=>错误,
“仅显示正文”=>true
);
$data=$tidy->repairString($data,$tidy_选项,'UTF8');
回波数据;
这适用于所有类型的输入,但我尝试使用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…
,那么它工作正常。-或者如果我指定
'show-body-only'=>false
它也可以正常工作
你知道为什么会这样吗?
提前谢谢
编辑:尝试将pankar的建议设置为true,但没有成功…尝试将选项保存实体指定为true
(默认为false
)
编辑
秒(更彻底的)想法。这是预期的行为。通过将show body only
设置为true
可以告诉tidy
输出xhtml
处理过的文档的正文部分
此设置实际上会忽略文档的
中的所有内容<代码>
组件是
的子组件。您可以通过简单地指定
$data=“我的网站”
输出将再次为空
您试图将带前缀的文本添加到
标记中,这简直是耍花招,因为它认为这些数据必须作为页面正文的一部分进行处理,从而才能显示出来
希望这次能有更多帮助。问题是您试图处理一个HTML片段
执行此操作时,文档的其余部分将被推断出来。如果您将配置保留为默认设置,并输出一个整洁的文档,其中只包含一段文本,您将看到您没有给它的DOCTYPE
、html
、head
和body
标记。它推断这些标签必须存在
这里的问题是,报告指出:
OBJECT元素也可能出现在HEAD元素的内容中
当推断片段的位置时,它会将其放在第一个可能发生的位置。这意味着tidy将把它放在头部
标记中
show body only
影响输出的原因是您的片段没有放置在body
中
但是当您添加一些文本时,它会强制您的代码片段进入主体
标记。这是因为头标记中不允许使用原始文本。因此,逻辑推断出的片段位置在主体中
在我看来,您可用的最佳选择是将所有代码片段注入到“模板”文档中,然后再次解析它们。你可以很容易地用它来做这件事
第二种解决方案是注入一个哨兵值,当仅显示身体时,您可以在之后再次去除该值
即
我的魔法令牌____
然后,您可以在之后再将其取出。嗨,潘卡尔,谢谢您的回复。我试过你的建议,但又没有成功。这是否意味着tidy认为我的代码…
不是格式良好的实体?那么,如果我在输入目标代码的同时输入其他文本,为什么效果会很好呢。我理解您描述的'show-body-only'=>真实的部分,这是必要的行为。我不明白的是“
组件是
的子组件”!我是不是错过了这样重要的事情?我找不到任何证明你索赔的文件。当然,如果这是真的,那么我的问题的解决方案是显而易见的。请你再详细说明一下好吗?非常感谢您抽出时间!:)我理解您的担忧,我知道这没有道理,但这似乎是tidy的一个限制(可能认为它是需要放在头部的元数据信息?)。我最终相信这是一只虫子!嗨,莱特,谢谢你费心回答我的问题,并提供了一个足够解释的答案。现在我明白了这个问题,并且可以为自己提供一个解决方案(你的两个建议似乎都是合法的)。我从来没有想到对象元素也会出现在HEAD元素的内容中。
没问题,标准是棘手的错误。每个人都想坚持,但大多数人都不知道(或不在乎)其中有什么。经过一些实验和一个“wtf”的时刻,我必须自己查一下才能确定!
____MY_MAGIC_TOKEN____
<object ...></object>