我将帖子作为用户的输入。用户可以<a href=""></a>
在帖子中输入标签。我需要做的是,如果任何用户输入任何<a>
标签,那么我必须插入一个类<a class="user" href=""></a>
并保存到数据库。
我怎样才能做到这一点?我正在使用删除除用户输入之外的strip_tags()
所有标签。<a>
您可以使用正则表达式来做到这一点,但很难找到一个始终有效的好方法。看到这个线程。
您可以使用的是HTMLPurifier。我用它来清理所有发布的信息。您可以选择要保留的标签、要为每个标签保留的属性等..
防止 XSS 并确保符合标准的输出的 HTML 过滤器。
您可以使用 HTMLPurifier 做的一件事是扩展核心代码,然后对于给定的标签,扩展类以为每个实体添加一个类。
您可以查看用户想要转换的这个(快速)示例:
<p>This is a paragraph</p>
<p>Another one</p>
进入这个:
<p class="myclass">This is a paragraph</p>
<p class="myclass">Another one</p>
编辑:
这是一个快速而肮脏的示例,您可以自己测试:
<?php
require_once 'lib/library/HTMLPurifier.auto.php';
class HTMLPurifier_AttrTransform_AnchorClass extends HTMLPurifier_AttrTransform
{
public function transform($attr, $config, $context)
{
// keep predefined class
if (isset($attr['class']))
{
$attr['class'] .= ' myclass';
}
else
{
$attr['class'] = 'myclass';
}
return $attr;
}
}
$dirty_html = '<p><a href=""></a>
<a target="_blank" href=""></a>
<a href="" class="toto"></a>
<a href="" style="oops"></a></p>';
$options = array(
'HTML' => array(
'Allowed' => 'a[href|target|class]')
);
$config = HTMLPurifier_Config::create($options);
$htmlDef = $config->getHTMLDefinition(true);
$anchor = $htmlDef->addBlankElement('a');
$anchor->attr_transform_post[] = new HTMLPurifier_AttrTransform_AnchorClass();
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);
var_dump($clean_html);
它输出:
string '<a href="" class="myclass"></a>
<a href="" class="myclass"></a>
<a href="" class="toto myclass"></a>
<a href="" class="myclass"></a>' (length=135)
我使用自定义配置将一些属性保留在<a>
标签中,这就是它删除style
但不删除的原因target
。您可以查看相关文档。