検索
ホームページphp教程php手册PHP Tidy - 完璧な XHTML エラー修正フィルタリング

PHP Tidy - 完璧な XHTML エラー修正フィルタリング

Jun 13, 2016 pm 12:32 PM
xhtml関数そして基本ユーザー修正ネット美しい入力出力フィルター

入力と出力
入力と出力は、多くの 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 内の安全でないコードのみが消去されます。
ブラウザ互換の自動行折り返しを実現するには、非常に長い文字列に タグを挿入します。関連記事については、Web ページ内の非常に長いテキストの改行の問題を参照してください。
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) ){

// ノード名を確認し、<script> および <style> の場合は直接クリアします <br> switch($node->name){ <BR> case 'script ': <br> case 'style': <br> return; <BR> デフォルト: <BR> } <BR><BR> if($node->type == TIDY_NODETYPE_TEXT){ <BR> /* <BR> ノードにテキストが含まれている場合は、追加の処理を実行します。 <BR> 長すぎるテキストの自動行折り返し <br> ハイパーリンクの自動認識 (未実装) <br> */ <BR> // insert &lt ;wbr><BR> * <BR> return; <BR> } <BR><BR> // テキストノードでない場合は、ラベルとその属性を処理します。 <BR> $s.= '< '.$node->name; <br><br> //各属性を確認します<BR> if($node->attribute){ <BR> foreach($node->attribute as $name=> $value){ <br><br> /* <BR> 通常 on で始まるいくつかの DOM イベントをクリーンアップします。<br> たとえば、onclick onmouseover など.... <br> または、属性値に次の単語が含まれていますjavascript:, <BR> たとえば、 href="javascript:" <BR> */ <br> if(strpos($name,'on') === 0 <br><BR> stripos(trim) ($value),'javascript:') ===0 <BR> ){ <BR> '"'; <BR><BR> } <BR> } <br><br> // 子ノードを再帰的にチェックしますこのノードの下で<BR> if($node->child){ <BR><BR> $s .= '><br> foreach($node->child as $child){ <br> _dumpnode($child,$s); <BR> } <br><br> //子ノードが処理された後、ラベルを閉じます <BR> $s .= '</'.$node- >名前。'>' <br> }else{ <br><br> /* <BR> 子ノードはもうないので、ラベルを閉じます <BR> (実際には、空のノードを直接削除することも検討できます) <BR> */ <BR> if( $node ->type == TIDY_NODETYPE_START) <BR> $s .= '></'.$node->name.'>'; <BR> else <BR> /* <BR> の場合一致しないタグ (例: & hr/& gt; <BR> を閉じるまで待機します)。 🎜> $ s. = '/& Gt;'; <BR> } <BR> } <BR> //関数定義終了 <BR><BR> //上記の関数によるボディノードのフィルタリングを開始します。 <br> if($body->child){ <br><BR> foreach($body->child as $child) <br> _dumpnode($child,$s); else <🎜; > return ''; <br><BR> return $s; <BR>} <BR>コードの動作原理をさらに詳しく見てみましょう。 <br>記事内のリンクの自動識別など、より厳密なフィルタリングも簡単に拡張できます。 <br><BR><BR>少し追加<BR><br>以前に書いた Web ページで非常に長いテキストの改行の問題を見たことがある方は、自動行折り返しを処理する関数が上記のコードは異なります。<br><BR>HtmlEscapeInsertWbrs() は以前に導入され、HtmlInsertWbrs() は上で使用されました。 <br><br>ここで説明が必要です。<br>HtmlEscapeInsertWbrs() では、入力文字列が特殊文字でエスケープされていないことが必要です。つまり、入力文字列は <>& の htmlspecialchars() によって処理されていません。 <>など。関数内に特殊な処理があるためです。 <br>Tidy によって処理されたテキスト ノードを処理する場合、Tidy により、<>& などの文字は対応する <>& で自動的にエスケープされるため、エスケープを繰り返す場合は、特別な関数を使用して回避する必要があります。関数は HtmlInsertWbrs() です。名前からわかるように、この関数は <wbr> タグを挿入するだけで、追加の処理は行いません。 <br><br>次に、<BR><wbr> が <div> の途中に挿入されている場合、 <d<wbr>iv> となり、元の情報の表示に影響します。 <BR><br>はい、これは確かに新しい問題ですが、いくつかのテクニックを使用して効果的に解決できます: <br><BR>Tidy によって取得されたテキスト ノードを扱っているため、遭遇することは不可能です。 HTML タグなので、タグの途中に <wbr> を挿入する必要はありません。 <br>2 番目のケースでは、エスケープ文字はすべて &xxxxx; の形式になっており、1 のすべての & 記号の前に <wbr> マークを挿入します ( を呼び出すときは 4 番目のパラメータに注意してください)。次の <wbr> タグは、30 文字 (上記のコードで実際に呼び出される 2 番目のパラメーターを例として取り上げます) の後に挿入されますが、これはすでに xxxxx の長さよりも 2 はるかに大きくなっています。このように、上記 1 と 2 の 2 点により、エスケープ文字の途中に挿入されないようにすることができます。  <BR>次に出てくる HtmlInsertWbrs() の PHP 实现: <br><br>function HtmlInsertWbrs($str, $n=10, <BR> $chars_to_break_after='',$chars_to_break_before='') <BR>{ <BR> $out = ''; <BR> $strpos = 0; <BR> $spc = 0; <BR> $len = mb_strlen($str,'UTF-8'); <BR> for ($i = 1; $i < $len; $i) { <BR> $prev_char = mb_substr($str,$i-1,1,'UTF-8'); <BR> $next_char = mb_substr($str,$i,1,'UTF-8'); <BR> if (_u_IsSpace($next_char)) { <BR> $spc = $i; <BR> } else { <BR> if ($i - $spc == $n <br><br> mb_strpos( $chars_to_break_after, <BR> $prev_char,0 ,'UTF-8' ) <BR> != = FALSE <br><br> mb_strpos( $chars_to_break_before, <BR> $next_char,0,'UTF-8') <BR> !== FALSE <BR> ) { <BR> $out .= mb_substr($str ,$strpos, <BR> $i-$strpos,'UTF-8') <BR> 。 '<wbr>'; <BR> $strpos = $i; <BR> $spc = $i; <BR> } <BR> } <BR> } <BR> $out .= mb_substr($str,$strpos,$len-$strpos,'UTF-8'); <BR> $out を返す; <BR>} <BR>... <BR>わかりました、先にこれを書いてください。関連するコンテンツは文中に接続されています。 <BR>次に再充電します。 <BR> </script>

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境