[PHP-users 34997] Re: htmlタグの<と単なる<の区別

うすき ujuworld @ yahoo.co.jp
2010年 2月 14日 (日) 05:12:26 JST


うすきです。

簡単には行かないかと思いますが、以下の方法でできるかも知れません。

・受け付けるタグとその属性のセットと、包含可能タグを厳選する
・HTMLエンティティとして扱うものを厳選する。
・属性について、HTML仕様にかなっていれば通して対応しない属性だったら
 無視するのか、タグとして扱わないかを決める。
 <table value="送信"> といったありえない属性だったら、
  &lt;table value="送信"&gt; とするのか、そぎ落として<table> とする
 のか。
・再起的なパースを行う構造にする。
 tableコンバーターというインスタンスがあったら、その子コンバーター
 として、thead, tbody, tfoot, tr コンバーターを持つといったような
 感じです。
・開始タグが受付タグにマッチしたら、そのタグが包含可能な
 子コンバーターの開始タグと自分の閉じタグを探し、はじめに
 マッチした箇所までを htmlspecialchars して、マッチしたコンバーターに
 処理を渡す。自分の閉じタグだった場合、親に処理を返す。
・閉じタグが見つからなかったり開始タグが不正だったら、開始タグを無効に
 して(&lt;, &gt; にして)親コンバーターに処理を返す。
 (このとき、子コンバーターがやった作業はすべて無駄になります)
・入れ子不可なタグだった場合もタグを無効にする仕組みを入れておく
 <a><b><a>...</a></b></a> みたいな時に、はじめのAコンバーターが
 子コンバーター達に、Aコンバーターを除外させることができるような
 しくみです。

厳密に受け付けるように決定したもの以外は、すべてタグ扱いにならないはずで
すが、お望みの「意外と簡単だったらうれしいです」には当てはまらないかもし
れません。
受付ルールをゆるくすると多少楽になるかも知れませんが、筆者の意図からずれ
るケースも増えてくる気がします。

またHTMLエンティティについても、筆者がそれを想定して入力している場合、同
様に受け付けるものを厳選して、コンバータークラスを定義する必要があるかと
思います。


--------
uju
--------------------------------------
VANCOUVER 2010 Olympic News [Yahoo! Sports/sportsnavi]
http://pr.mail.yahoo.co.jp/olympic/


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