ブログネタ
こんなことありました に参加中!

つい先日このブログで紹介した、HTMLPurifierという
HTMLタグ洗浄用のphpライブラリがあまりに便利なので、
最近はホイホイ使っちゃっているんだが、実を言うと、
使い始めの頃はいろいろと苦労しました。


例えば、タイトルで謳ったリンクのtarget指定が外れてしまう件。

一般的には、タグ属性のホワイトリストに「target」を指定して
おけば、targetは残してくれそうなモンだけど、その指定の仕方が
わからない。

HTMLPurifierのインスタンスを生成する際のパラメータか、
環境設定のメソッドで設定できると思うんだけど。。


以前の記事で書いたサンプル↓

 <?php

   // ライブラリをインクルード
   require_once('HTMLPurifier.auto.php');

   // HTMLPurifierを生成する
   $hp_conf = HTMLPurifier_Config::createDefault();
   $hp_conf->set('Cache', 'SerializerPath', './cache');
   $hp_conf->set('Core', 'Encoding', 'EUC-JP');
   $hp = new HTMLPurifier($hp_conf);

   // 危険なHTMLタグを無効化
   $clean_str = $hp->purify( $dirty_str );
   echo $clean_str;

 ?>


これの

 $hp_conf->set('Core', 'Encoding', 'EUC-JP');

の部分みたいな感じで、設定すればいいじゃないかな、と。多分。

で、HTMLPurifierの環境設定資料を見てみると、
「AllowedAttributes」という設定がある。

■ HTMLPurifier:Configuration Documentation
http://htmlpurifier.org/live/configdoc/plain.html#HTML.AllowedAttributes


タグの属性の許可設定か。
多分、コイツに「aタグのtarget」を追加しておけばいいんだろう。

って事で、早速こんな感じで指定してみる↓


 $hp_conf->set('HTML', 'AllowedAttributes', array( 'a.target' ));


で、以下の文字列でテストしてみると、、

 <a href="http://www.google.com/" target="_blank">Google</a>
  ↓↓↓ HTMLPurifierをかます ↓↓↓
 <a>Google</a>


?!

aタグの属性が全部消えた!!

そうか、a.targetしか指定しなかったから、
hrefがサプレスされたのか。


って事で、AllowedAttributesの指定を

 array( 'a.target', 'a.href' )

としてみると、、、

 <a href="http://www.google.com/" target="_blank">Google</a>
  ↓↓↓ a.hrefも指定 ↓↓↓
 <a href="http://www.google.com/">Google</a>

hrefは通ったけど、targetは相変わらずダメだ。。
classとかは通るんだけどなー。なんだろ??


試しに、Allowedで指定してみたけど、これもダメ(当たり前か)。

 $hp_conf->set('HTML', 'Allowed', 'a[href|class|target]');


targetは属性として見られていないって事??

うーむ、わからん。。属性以外に何をイジりゃいいんだよ。。

と呻きながら、Configuration Documentationを頭から読んでみると、、

あれ?なんだこれ?
Attrの設定値に「AllowedFrameTargets」なんてモノが!

■ HTMLPurifier:Configuration Documentation
http://htmlpurifier.org/live/configdoc/plain.html#Attr.AllowedFrameTargets


なるほど、ここにTarget指定で許可する値を列挙すれば
いいって事ね。

てか、まんまそう書いてあるじゃん、、、見落としてました。


って事で、こいつを使って_blankと_selfだけを通してみる。

 $hp_conf->set('Attr', 'AllowedFrameTargets', array('_blank','_self'));


すると、
 <a href="http://www.google.com/" target="_blank">Google</a>
  ↓↓↓
 <a href="http://www.google.com/" target="_blank">Google</a>
ようやくtargetが効いてくれました。よかったよかった。



こんな感じで、HTMLPurifier_Config::createDefault()の
インスタンスに環境設定値を突っ込めば、かなり細かく
カスタマイズできます。

HTMLPurifier()インスタンスの生成時に、直接環境設定値を
突っ込んでもOK。

Configuration Documentationをダラ見しつつ、
HTMLPurifier_Configのsetメソッドをバンバン試してみましょう。


てか、こんな所で躓いてるのは俺くらいなもんかw