2010年2月14日

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

うすきです。

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

・受け付けるタグとその属性のセットと、包含可能タグを厳選する
・HTMLエンティティとして扱うものを厳選する。
・属性について、HTML仕様にかなっていれば通して対応しない属性だったら
 無視するのか、タグとして扱わないかを決める。

 <table value="送信"> といったありえない属性だったら、
<table value="送信"> とするのか、そぎ落として<table> とする
 のか。
・再起的なパースを行う構造にする。
 tableコンバーターというインスタンスがあったら、その子コンバーター
 として、thead, tbody, tfoot, tr コンバーターを持つといったような
 感じです。
・開始タグが受付タグにマッチしたら、そのタグが包含可能な
 子コンバーターの開始タグと自分の閉じタグを探し、はじめに
 マッチした箇所までを htmlspecialchars して、マッチしたコンバーターに
 処理を渡す。自分の閉じタグだった場合、親に処理を返す。
・閉じタグが見つからなかったり開始タグが不正だったら、開始タグを無効に
 して(<, > にして)親コンバーターに処理を返す。
 (このとき、子コンバーターがやった作業はすべて無駄になります)
・入れ子不可なタグだった場合もタグを無効にする仕組みを入れておく
 <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 mailing list PHP-users@xxxxx
http://ml.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://oldwww.php.gr.jp/php/novice.php3


投稿者 xml-rpc : 2010年2月14日 05:12
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/93281
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。