gpt4 book ai didi

php 整洁的奇怪行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:06:15 28 4
gpt4 key购买 nike

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

这适用于所有类型的输入,除非我尝试使用 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 片段

当您这样做时,文档的其余部分将被推断。如果您保留默认配置,并输出一个只有一段文本的整洁文档,您将看到 DOCTYPEhtmlhead和你没有给它的 body 标签。它推断这些标签必须存在。

这里的问题是 HTML specification regarding objects指出:

The OBJECT element may also appear in the content of the HEAD element.

当推断您的片段的位置时,它会将它放在可能发生的第一位。这意味着 tidy 会将它放在 head 标签中。

show-body-only 影响您的输出的原因是您的片段没有被放置在 body 中。


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

在我看来,您可用的最佳选择是将所有代码片段注入(inject)"template"文档,然后再将它们解析出来。你可以很容易地用 DOMDocument 做到这一点.

第二种解决方案是注入(inject)一个标记值,您可以在仅显示正文时再次将其删除。

____MY_MAGIC_TOKEN____
<object ...></object>

然后你可以再把它去掉。

关于php 整洁的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11670116/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com