ユーザーからの入力として投稿しています。ユーザー<a href=""></a>
は投稿にタグを入力できます。私がする必要があるのは、ユーザーが<a>
タグを入力した場合、次のようなクラスを挿入し<a class="user" href=""></a>
てデータベースに保存する必要があることです。
どうすればこの簡単な方法を行うことができますか? ユーザー入力strip_tags()
以外のすべてのタグを削除するために使用しています。<a>
正規表現を使用してそれを行うことができますが、常に機能する適切なものを見つけるのは困難です。このスレッドを参照してください。
使用できるのはHTMLPurifierです。投稿されたすべての情報をクリーンアップするために使用します。保持するタグ、各タグの保持する属性などを選択できます。
XSS から保護し、標準に準拠した出力を保証する HTML フィルター。
HTMLPurifier でできることの 1 つは、コア コードを拡張し、特定のタグに対してクラスを拡張して各エンティティのクラスを追加することです。
ユーザーがこれを変換したい場合、この (簡単な) 例を確認できます。
<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
。それに関するドキュメントを確認できます。