gpt4 book ai didi

php - HTML 净化器 : Converting to

转载 作者:可可西里 更新时间:2023-10-31 22:59:57 25 4
gpt4 key购买 nike

前提

我想使用 HTML Purifier改造 <body>标记为 <div>标签,以保留 <body> 上的内联样式元素,例如<body style="background:color#000000;">Hi there.</body>会转向<div style="background:color#000000;">Hi there.</div> .我正在查看 custom tag 的组合和一个 TagTransform类。

当前设置

在我的配置部分,我目前正在这样做:

$htmlDef  = $this->configuration->getHTMLDefinition(true);
// defining the element to avoid triggering 'Element 'body' is not supported'
$bodyElem = $htmlDef->addElement('body', 'Block', 'Flow', 'Core');
$bodyElem->excludes = array('body' => true);
// add the transformation rule
$htmlDef->info_tag_transform['body'] = new HTMLPurifier_TagTransform_Simple('div');

...以及允许 <body>及其 style (和 classid )属性通过配置指令(它们是解析为 HTML.AllowedElementsHTML.AllowedAttributes 的工作大列表的一部分)。

我已经关闭了定义缓存。

$config->set('Cache.DefinitionImpl', null);

不幸的是,在这个设置中,它看起来像 HTMLPurifier_TagTransform_Simple从来没有它的transform()调用的方法。

HTML.Parent?

我认为罪魁祸首是我的 HTML.Parent ,设置为 'div'因为,很自然地,<div>不允许 child <body>元素。但是,设置 HTML.Parent'html'网我:

ErrorException: Cannot use unrecognized element as parent

添加...

$htmlElem = $htmlDef->addElement('html', 'Block', 'Flow', 'Core');
$htmlElem->excludes = array('html' => true);

...摆脱了该错误消息,但仍然没有转换标签 - 它被删除了。

添加...

$htmlElem = $htmlDef->addElement('html', 'Block', 'Custom: head?, body', 'Core');
$htmlElem->excludes = array('html' => true);

...也什么都不做,因为它给我一个错误信息:

ErrorException: Trying to get property of non-object       

[...]/library/HTMLPurifier/Strategy/FixNesting.php:237
[...]/library/HTMLPurifier/Strategy/Composite.php:18
[...]/library/HTMLPurifier.php:181
[...]

我现在仍在调整最后一个选项,试图找出我需要提供的确切语法,但如果有人知道如何根据自己过去的经验帮助我,我将不胜感激正确的方向。

HTML.TidyLevel?

作为我能想象的唯一其他罪魁祸首,我的 HTML.TidyLevel设置为 'heavy' .我还没有尝试过所有可能的星座,但到目前为止,这没有任何区别。

(因为我只是次要接触这个,所以我很难记忆起我已经尝试过哪些星座,以免我会在这里列出它们,但由于我缺乏信心,我不会错过我做过的事情或误报。不过,我可能会在完成一些专门测试后编辑此部分!)

完整配置

我的配置数据存储在 JSON 中,然后解析为 HTML Purifier。这是文件:

{
"CSS" : {
"MaxImgLength" : "800px"
},
"Core" : {
"CollectErrors" : true,
"HiddenElements" : {
"script" : true,
"style" : true,
"iframe" : true,
"noframes" : true
},
"RemoveInvalidImg" : false
},
"Filter" : {
"ExtractStyleBlocks" : true
},
"HTML" : {
"MaxImgLength" : 800,
"TidyLevel" : "heavy",
"Doctype" : "XHTML 1.0 Transitional",
"Parent" : "html"
},
"Output" : {
"TidyFormat" : true
},
"Test" : {
"ForceNoIconv" : true
},
"URI" : {
"AllowedSchemes" : {
"http" : true,
"https" : true,
"mailto" : true,
"ftp" : true
},
"DisableExternalResources" : true
}
}

( URI.BaseURI.MungeCache.SerializerPath 也已设置,但我已在此粘贴中删除了它们。此外, HTML.Parent 警告:如前所述,通常将其设置为 'div' 。)

最佳答案

此代码是您所做的不起作用的原因:

/** * Takes a string of HTML (fragment or document) and returns the content * @todo Consider making protected */public function extractBody($html) {    $matches = array();    $result = preg_match('!<body[^>]*>(.*)</body>!is', $html, $matches);    if ($result) {        return $matches[1];    } else {        return $html;    }}

您可以使用 %Core.ConvertDocumentToFragment as false 将其关闭;如果您的其余代码没有错误,它应该可以直接从那里开始工作。我不认为你的 bodyElem 定义是必要的。j

关于php - HTML 净化器 : Converting <body> to <div>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2766227/

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