[PHP-users 34433] htmlタグのエスケープ処理

TNishimura nisimura @ gatewaytec.jp
2009年 3月 19日 (木) 14:56:57 JST


西村と申します。

CentOS 5.2
PHP 5.2.6
Apache 1.3.24
にて、POSTされた投稿データから許可したタグ以外をエスケープ処理しようとしております。
そこで、下記モジュールを作成し下記データを通した所、
<p style="color:red;">
<img src="image.jpg" />
<font color="Green">
<a href="link.html" target="_blank_">
上記、4つのタグだけが、正規表現にマッチしません。
正規表現の間違えなのかと思うのですが、解決出来ません。

strip_tags()も検討しましたが、不要なタグを削除ではなく、表示させたいので、今回は利用出来ません。

良きアドバイス等頂けますでしょうか?
宜しくお願いします。


/////////////  モジュール  ////////////////

function escape_text($TEXT){

 // 許可タグ
 $Allow = 
array('br','p','img','font','table','tr','th','td','a','b','big','center','h','hr','strong','tt','u','li','ul');

 // まず全てエスケープ
 $TEXT = htmlspecialchars($TEXT, ENT_NOQUOTES);
 $CNT = count($Allow);

 for($i=0; $i<$CNT; $i++){
  $word = $Allow[$i];
  $Patern_1 = "(&lt;)(".$word.")( *)([^(&gt;)]*)(&gt;)";
  $Patern_2 = "<\\2\\3\\4>";
  $Patern_3 = "(&lt;)/(".$word.")( *)([^(&gt;)]*)(&gt;)";
  $Patern_4 = "</\\2\\3\\4>";
  $TEXT = eregi_replace($Patern_1, $Patern_2, $TEXT);
  $TEXT = eregi_replace($Patern_3, $Patern_4, $TEXT);
 }

 return $TEXT;
}


/////////////////////////////////////////

///////////////  データ  //////////////////
<p style="color:red;">赤字</p>   <br>
<img src="image.jpg" /><br>
<font color="Green">Green</font><br>
<table border="1">
<tr><th colspan="2">タイトル</th></tr>
<tr><td>左</td><td>右</td></tr>
</table><br>
<a href="eregtest.html" target="_blank_">リンク</a><br>
<b>ボールド</b><br>
<big>ビッグ</big><br>
<center>センタリング</center><br>
<hr>
<h1>H1</h1>
<h2>H2</h2>
<h3>H3</h3>
<h4>H4</h4>
<strong>強調</strong><br>
<tt>TT表示中</tt><br>
<u>アンダーライン</u><br>
<ul>
<li>リスト
<li>リスト
<li>リスト
</ul>
/////////////////////////////////////////



PHP-users メーリングリストの案内