"a" 标签内的块元素 (htmlpurifier)

Block elements inside "a" tag (htmlpurifier)

如何防止 HTMLPURIFIER 破坏此代码:

<a target="_blank" href="http://www.example" class="link_normal opacity">
<blockquote url="http://www.example" class="big">
    <div class="center">
        <div class="table_cell"><img src="/images/imagenes_urls/4241.jpg" class="img_url"></div>
    </div>
    <p style="color:#3b5998" class="b">Desde los 80 hasta 2015, así ha sido la impresionante evolución de los móviles</p>
    <p>¿Cómo olvidarse de aquellos enormes objetos a los que llamábamos teléfonos móviles? Muchos de vosotros los recordar...</p>
    <span class="dominio">andro4all.com</span>
</blockquote></a>

我用的时候变成这样:

<blockquote class="big">
<a class="link_normal opacity" href="http://www.example"></a>
<div class="center">
    <a class="link_normal opacity" href="http://www.example"></a>
    <div class="table_cell">
        <a class="link_normal opacity" href="http://www.example">
        <img alt="4241.jpg" class="img_url" src="/images/imagenes_urls/4241.jpg">
        </a>
    </div>
    <a class="link_normal opacity" href="http://www.example"></a>
</div>
<a class="link_normal opacity" href="http://www.example"></a>
<p class="b" style="color:#3b5998;">
<a class="link_normal opacity" href="http://www.example">Desde los 80 hasta 2015, así ha sido la impresionante evolución de los móviles</a>
</p></blockquote>

在 HTML4 中用内联标签包装分组标签 blockquote 是无效的。

你也可以在这里找到关于这个标签的好信息http://www.w3.org/html/wg/drafts/html/master/grouping-content.html#the-blockquote-element

您可以使用一些技巧,例如将 JavaScript 添加到您的主标记中,例如:

onclick="document.location='http://www.example'"

你可以为光标添加指针样式,使其看起来像一个普通的 link:

style="cursor:pointer"

那将是这样的:

<blockquote url="http://www.example" class="big" onclick="document.location='http://www.example'" style="cursor:pointer">
    <div class="center">
        <div class="table_cell"><img src="/images/imagenes_urls/4241.jpg" class="img_url"></div>
    </div>
    <p style="color:#3b5998" class="b">Desde los 80 hasta 2015, así ha sido la impresionante evolución de los móviles</p>
    <p>¿Cómo olvidarse de aquellos enormes objetos a los que llamábamos teléfonos móviles? Muchos de vosotros los recordar...</p>
    <span class="dominio">andro4all.com</span>
</blockquote>

经过实验,我发现了这个特定问题的巧妙答案。您可以自定义 HTMLPurifier 的行为,如 http://htmlpurifier.org/docs/enduser-customize.html.

中所述

具体来说,您可以通过再次定义元素来覆盖 'a' 锚元素的默认行为,如下所示:

include_once('HTMLPurifier.auto.php');
$config = HTMLPurifier_Config::createDefault();
$def = $config->getHTMLDefinition(true);

// here is the magic method that overwrites the default anchor definition
$def->addElement(
  'a', // element name
  'Inline', // the type of element: 'Block','Inline', or false, if it's a special case
  'Flow', // what type of child elements are permitted: 'Empty', 'Inline', or 'Flow', which includes block elements like div
  'Common' // permitted attributes
);

$purifier = new HTMLPurifier($config);

// $dirty_html is the html you want cleaned
echo $purifier->purify($dirty_html);

现在您可以在锚标记内包含块元素,正如 HTML5 规范 (http://dev.w3.org/html5/markup/a.html) 所允许的那样。

为了获得更强大的 HTML5 解决方案,Christoffer Bubach 提供了详细的 HTMLPurifier 配置以允许更新的 HTML5 标签,尽管它没有重新定义定位标签以允许其中的块元素。查看他对这个 SO 问题的回答:HTML filter that is HTML5 compliant