入力と出力
入力と出力は、多くの Web サイトの基本機能とも言えます。ユーザーがデータを入力すると、Web サイトは他の人が閲覧できるようにそのデータを出力します。
現在人気のブログを例に挙げます。ここでの入力と出力は、作成者が記事を編集し、他の人が読めるようにブログ記事ページを生成することです。
ここで問題が発生します。つまり、ユーザー入力は通常制御されておらず、不正な形式やセキュリティ上のリスクを伴うコードが含まれている可能性がありますが、Web サイトによって出力される最終コンテンツは正しい HTML コードである必要があります。これには、エラー修正とユーザー入力のフィルタリングが必要です。
ユーザー入力を決して信用しない
あなたは次のように言うかもしれません: 今ではどこにでも WYSIWYG エディター (WYSIWYG) があり、FCKeditor、TinyMCE... 名前はたくさんあるでしょう。確かに、これらはすべて標準の XHTML コードを自動的に生成できますが、Web 開発者であれば、「ユーザーが送信したデータを決して信頼しない」という言葉を聞いたことがあるはずです。
したがって、ユーザー入力データを修正およびフィルタリングする必要があります。
より良いエラー修正とフィルタリングが必要です
これまでのところ、私が満足できる関連実装は見たことがありません。通常、非効率で理想的とは言えず、あれこれあります。 . 明らかな欠陥。よく知られた例を挙げると、WordPress は非常に広く使用されているブログ システムであり、操作が簡単で強力であり、豊富なプラグイン サポートを備えており、バックグラウンドで多数の巧妙なエラー修正およびフィルタリング コードをサポートしています。非常に頭の痛い問題、半角文字の強制置換、過度に保守的な置換ルールなどにより、コードを貼り付けて正しく表示するという要件を達成することが困難になります。
ところで、このブログは WordPress でホストされていますが、これらの記事を正しく表示するために、ネットでいろいろ調べて、いくつかのプラグインを試してみました。コードを上書きし、一部をフィルタリングしました。ルールをコメントアウトすると、表示がまともになることはほとんどありません -.-b
もちろん、私はそれ (WordPress) をあまり批判したくないのですが、それを示したいだけですもっと良くできるよ。
Tidy とは何ですか?また、どのように機能しますか?
Tidy ManPage から引用した説明では、次のように説明されています。
Tidy は、HTML、XHTML、および XML ファイルを読み取り、W3C 準拠でほとんどのブラウザーで動作するクリーンアップされたマークアップを書き込みます。一般的な XML ファイルの場合、Tidy は、HTML コードをクリーンアップし、W3C 標準に準拠したクリーンな HTML コードを生成し、HTML をサポートすると言われています。 XHTML と XML。 Tidy は、Tidy の強力な機能を他のアプリケーションで簡単に使用できるようにするライブラリ TidyLib を提供します。幸いなことに、PHP には使用できる対応する Tidy モジュールがあります。
おい、なぜまた PHP なのか?
えっと、この質問…恥ずかしいのだが、私は PHP について少ししか知らないので -.-v
でも大丈夫、そんなことはないここで私が話しているのは、純粋なコード、少なくとも一部の分析プロセス、これらのものを共有することは、コードを投稿するよりもはるかに有益です。
PHP で Tidy を使用する
PHP で Tidy を使用するには、Tidy モジュールをインストールする必要があります。これは、PHP 拡張機能 tiny.so をロードすることを意味します。具体的なプロセスは省略されており、純粋に物理的な作業です。最後に、phpinfo()で「Tidy support有効」と表示されていればOKです。
このモジュールのサポートにより、Tidy が提供するほぼすべての機能が PHP で使用できるようになります。一般的に使用される HTML のクリーニングは非常に簡単で、ドキュメントの解析ツリーを生成し、クライアント上で DOM を操作するように HTML の各ノードを操作することもできます。以下に具体的なコードの手順を示します。また、公式の PHP マニュアルも参照してください。
エラー修正とフィルタリングの PHP Tidy 実装
上で述べた非常に多くの背景資料は非常にわかりにくいように思えますが、問題を解決するための具体的なコードが最も直接的です。
1. 単純なエラー修正の実装
function HtmlFix($html)
{
if(!function_exists('tidy_repair_string'))
return $ html ;
//tidy を使用して HTML コードを修復します
//修復
$str = tiny_repair_string($html,
array('output-xhtml'=>true),
'utf8'); 🎜> $nodes = @tidy_get_body($str)->子
if(!is_array($nodes)) {
$returnVal = 0 ;
return $s;
foreach($nodes as $n){
$s .= $n->value; 🎜> }
return $ s;
}
上記のコードは、標準化されていない可能性のある XHTML コードをクリーンアップして修正し、標準の XHTML コードを出力します (入力と出力の両方が UTF-8 でエンコードされます)。 。実装コードは以下のフィルタリング機能と連携させるため、できるだけ詳細に記述したため、あまり合理化されたものではありません。
2. 高度な実装: エラー修正とフィルタリング
機能:
XHTML エラー修正、標準 XHTML コードを出力します。
安全でないコードをフィルタリングしますが、コンテンツの表示には影響しません。スタイル/JavaScript 内の安全でないコードのみが消去されます。
ブラウザ互換の自動行折り返しを実現するには、非常に長い文字列に
function HtmlFixSafe($html)
{
if(!function_exists('tidy_repair_string'))
return $html
//tidy を使用して HTML コードを修復します。
// 整然としたパラメータ設定
$conf = array(
'output-xhtml'=>true
,'drop-empty-paras'=>FALSE
, ,' join -classes'=>TRUE
, ,'show-body-only'=>TRUE
//修復
$str = tiny_repair_string($html,$); conf ,'utf8');
//解析ツリーを生成します
$str = tiny_parse_string($str,$conf,'utf8');
$s =''; 🎜 > //ボディノードを取得
$body = @tidy_get_body($str);
//関数 _dumpnode、各ノードを確認し、フィルターして出力
function _dumpnode($node,&$s) ){
// ノード名を確認し、