在php中的用户输入中插入某些标记属性

时间:2012-12-26 10:08:46

标签: php html anchor

我正在接受用户的输入。用户可以在帖子中输入<a href=""></a>标记。我需要做的是,如果任何用户输入任何<a>标签,那么我必须插入类似<a class="user" href=""></a>的类并保存到数据库。

我怎样才能这么简单?我正在使用strip_tags()删除用户输入中除<a>之外的所有代码。

1 个答案:

答案 0 :(得分:2)

你可以使用正则表达式来做到这一点,但很难找到始终有效的好词。 See this thread

您可以使用的是HTMLPurifier。我用它来清理所有发布的信息。您可以选择要保留的标记,为每个标记保留的属性等。

  

HTML过滤器,可防范XSS并确保符合标准的输出。

使用HTMLPurifier可以做的一件事是扩展核心代码,然后,对于给定的标记,扩展类以为每个实体添加一个类。

您可以查看this (quick) example用户想要转换的内容:

<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的原因。您可以查看documentation