Php 他有奇怪的行为

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

我正在使用php的tidy库来“清理和修复”来自用户输入的一些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;
$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>