1

我怎么能得到:

<p>first<br>p</p>
<p>second p</p>

从:

<p>first
p</p>
<p>second p</p>

使用 HTMLPurifier?

4

1 回答 1

3

我不确定具体细节,但由于这个问题没有答案,看看这些指针是否对你有帮助:

如果您真的打算使用 HTML Purifier 来解决这个问题,您也许可以编写一个 textnode 转换来执行nl2brstr_replace通过编写一个扩展的类HTMLPurifier_AttrDef_Text。伪代码:

class HTMLPurifier_AttrDef_Text_Linebreaks extends HTMLPurifier_AttrDef_Text
{
    public function validate($string, $config, $context) {
        $string = parent::validate($string, $config, $context);
        return str_replace("\n", "<br />", $string);
    }
}

然后你将你的类注入 HTML Purifier:

$purifier->set('HTML.DefinitionID', 'aNameForYourDefinition');
$purifier->set('HTML.DefinitionRev', 1);
//$purifier->set('Cache.DefinitionImpl', null);
$htmlDef = $purifier->config->getHTMLDefinition();
$htmlDef->manager->attrTypes->set(
     'Text',
     new HTMLPurifier_AttrDef_Text_Linebreaks()
);

注意事项:

  1. Text AttrDef 可能是htmlspecialchars()-ed (它会是理智的,真的)。那么你对这种方法不走运。相反,您必须找到一种注入<br />节点的方法。
  2. 这可能为时已晚,无法为您提供所需的控制 - 更改文本节点“模板”(可以这么说),但实际的 HTML 定义可能已经很高兴地使用了一个HTMLPurifier_AttrDef_Text实例。

看看这对你有帮助吗?

HTML Purifier 论坛上也有一个帖子(你开始了吗?我不会感到惊讶)- nl2br, auto <br /> insertion。如果您找到解决方案,您可以在此处发布您的答案。

于 2011-02-22T12:43:38.270 回答