PHP+Tidy - 完璧な XHTML エラー修正 + filtering_PHP チュートリアル
入力と出力 http://www.bkjia.com/PHPjc/318191.html
入力と出力は、多くの Web サイトの基本機能であると言えます。ユーザーがデータを入力すると、Web サイトは他の人が閲覧できるようにそのデータを出力します。
現在人気のブログを例に挙げます。ここでの入力と出力は、作成者が記事を編集し、他の人が読めるようにブログ記事ページを生成することです。
ここには問題があります。つまり、ユーザー入力は通常制御されておらず、セキュリティ上のリスクを伴う不正な形式やコードが含まれている可能性がありますが、Web サイトの最終出力は正しい HTML コードである必要があります。これには、エラー修正とユーザー入力のフィルタリングが必要です。
ユーザー入力を決して信用しないでください
あなたは次のように言うかもしれません: FCKeditor、TinyMCE など、今ではどこにでも WYSIWYG エディターが存在します...名前はたくさんあるかもしれません。確かに、これらはすべて標準の XHTML コードを自動的に生成できますが、Web 開発者であれば、「ユーザーが送信したデータを決して信頼しない」という言葉を聞いたことがあるはずです。
そのため、ユーザー入力データを修正およびフィルタリングする必要があります。
より良いエラー修正とフィルタリングが必要です
これまでのところ、私が遭遇した実装は非効率的で、理想的とは言えず、何らかの明らかな欠陥があります。よく知られた例を挙げると、WordPress は非常に広く使用されているブログ システムであり、操作が簡単で強力であり、豊富なプラグイン サポートを備えており、バックグラウンドで多数の巧妙なエラー修正およびフィルタリング コードをサポートしています。非常に頭の痛い問題、半角文字の強制置換、過度に保守的な置換ルールなどにより、コードを貼り付けて正しく表示するという要件を達成することが困難になります。
ところで、このブログは WordPress によってホストされており、これらの記事を正しく表示するために、オンラインでたくさん検索し、いくつかのプラグインを試しました。いくつかのフィルタリング ルールをコメントアウトしました。まともに見えることはほとんどありません -.-b
もちろん、私はそれ (WordPress) をあまり批判したくありません。ただ、もっと良くできることを示したいだけです。
Tidy とは何ですか?またどのように機能しますか?
Tidy ManPage の説明からの抜粋:
Tidy は、HTML、XHTML、および 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+エラー修正とフィルタリングのきちんとした実装
上記の背景資料は非常に多く、非常に混乱しているように思えますが、問題を解決するための具体的なコードが最も直接的です。
1. 単純なエラー修正の実装
function HtmlFix($html)
{
if(!function_exists('tidy_repair_string'))
return $html
//tidy を使用して HTML コードを修復します
/ /repair
$str = tiny_repair_string($html,
array('output-xhtml'=>true),
tiny_parse_string($str,
=>true)、
turnVal = 0
$s を返す }
; foreach($nodes as $n){
$s .= $n->value; }
return $s;
上記のコードはクリーン化および修正されており、標準の XHTML は正しいです。コードが出力されます (入力と出力の両方が UTF-8 でエンコードされます)。実装コードは以下のフィルタリング機能と連携させるため、できるだけ詳細に記述したため、あまり合理化されたものではありません。
2. 高度な実装: エラー修正 + フィルタリング
機能:
XHTML エラー修正、標準 XHTML コードを出力します。
安全でないコードをフィルタリングしますが、コンテンツの表示には影響しません。スタイル/JavaScript 内の安全でないコードのみをクリアします。
ブラウザ互換の自動行折り返しを実現するには、非常に長い文字列に
function HtmlFixSafe($html)
{
if(!function_exists('tidy_repair_string'))
return $html;
// HTML コードを修復するために Tidy を使用します
// パラメータ設定を整理します
$conf = array( ,'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($ node、&$ s){
//ノード名を確認してください。 (未実装)
*** TODO ***
戻る; Foreach ($ node-& g t; $ 名 = & gt; としての属性) {
/*
一部の DOM イベントをクリーンアップします (通常は先頭にあります)。
Onclick onmouseover など ...
または属性値に javascript: 単語が含まれている場合、
、href = "javascript:" などもクリアされます。
'.$name.'="'. Htmlescape ($ Value). '"'" ';
}}
//ノード
の下の子ノードを筆記的に確認します if ($node-> child) {
$ s. =' & Gt;
foreach($node->child as $child){
_dumpnode($child,$s) } // 子ノードが処理されますそしてラベルは閉じられます
$s.= ''.$node ->name.'>'; }else{
$s .$s 。 .'>';
else
;待ってください
使用する ‐ ‐ ‐ ‐‐‐‐‐‐‐‐‐‐ - フィルター。
if($body->child){
foreach($body->child as $child)
_dumpnode($child,$s);
}else
return $s;
上記のコードのコメントを、コードと合わせてさらに詳しく見てみましょう。
記事内のリンクの自動識別など、より厳密なフィルタリングも簡単に拡張できます。
少し追加
以前に書いたウェブページで非常に長いテキストの改行問題を見たことがあれば、上記のコードの自動行折り返しを処理する関数が異なることに気づくかもしれません:
前回の紹介は HtmlEscapeInsertWbrs() だったので、上記の HtmlInsertWbrs() が使用されます。
ここで説明が必要です:
HtmlEscapeInsertWbrs() では、入力文字列が特殊文字でエスケープされていないこと、つまり、<>& などの htmlspecialchars() によって処理されていないことが必要です。関数内に特殊な処理があるためです。
Tidy で処理されたテキスト ノードを処理する場合、Tidy により <>& などの文字は対応する <>& で自動的にエスケープされるため、重複を避けるために特別な関数を使用する必要があります。この関数はHtmlInsertWbrs() は、名前からわかるように、
それでは、次のような質問があるかもしれません。
はい、それは確かに新しい問題ですが、いくつかのテクニックを使用して効果的に解決できます:
Tidy によって取得されたテキスト ノードを扱っているため、HTML タグに遭遇することは不可能であるため、途中に挿入します。タグの状況は発生しません。
2 番目のケースでは、エスケープ文字はすべて &xxxxx; の形式になっており、1 のすべての & 記号の前に
functionhtmlinsertwbrs($ str、$ n = 10、
$ chars_to_break_after = ''、$ chars_to_break_before = '')
{$ out = '';
$strpos = 0;
$spc = 0;
$len = mb_strlen($str,'UTF-8');
for ($i = 1; $i < $len; ++$i) {
$prev_char = mb_substr($str,$i-1,1,'UTF-8');
$next_char = mb_substr($str,$i,1,'UTF-8');
if (_u_IsSpace($next_char)) {
$spc = $i;
} else {
if ($i - $spc == $n
mb_strpos( $chars_to_break_after,
$prev_char,0,'UTF-8 ' )
!== FALSE
mb_strpos( $chars_to_break_before,
$next_char ,0,'UTF-8')
!== FALSE
) {
$out .= mb_substr($str,$strpos,
$i-$ strpos,'UTF-8')
。 '
$strpos = $i;
$spc = $i;
}
}
}
$out .= mb_substr($str,$strpos,$len-$strpos,'UTF-8');
$out を返す;
}
...
わかりました、先にこれを書いてください。関連する資料は文中にあります。
次に再充電します。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











ソーシャルメディアの急速な発展に伴い、Xiaohongshuは最も人気のあるソーシャルプラットフォームの1つになりました。ユーザーは、Xiaohongshu アカウントを作成して自分の個人情報を示し、他のユーザーと通信し、対話することができます。ユーザーの小紅樹番号を見つける必要がある場合は、次の簡単な手順に従ってください。 1. Xiaohonshu アカウントを使用してユーザーを見つけるにはどうすればよいですか? 1. 小紅書アプリを開き、右下隅の「検出」ボタンをクリックして、「メモ」オプションを選択します。 2. ノート一覧で、探したいユーザーが投稿したノートを見つけます。クリックしてノートの詳細ページに入ります。 3. ノートの詳細ページで、ユーザーのアバターの下にある「フォロー」ボタンをクリックして、ユーザーの個人ホームページに入ります。 4. ユーザーの個人ホームページの右上隅にある三点ボタンをクリックし、「個人情報」を選択します。

vivox100s と x100 携帯電話はどちらも vivo の携帯電話製品ラインの代表的なモデルであり、それぞれ異なる時代における vivo のハイエンド技術レベルを代表するものであるため、2 つの携帯電話にはデザイン、性能、機能に一定の違いがあります。この記事では、消費者が自分に合った携帯電話をより適切に選択できるように、これら 2 つの携帯電話を性能比較と機能分析の観点から詳しく比較します。まずはvivox100sとx100の性能比較を見てみましょう。 vivox100s には最新の機能が搭載されています。

インターネットの急速な発展に伴い、セルフメディアという概念が人々の心に深く根付いてきました。では、セルフメディアとは一体何でしょうか?その主な特徴と機能は何ですか?次に、これらの問題を 1 つずつ検討していきます。 1. セルフメディアとは何ですか? We-media は、その名前が示すように、あなたがメディアであることを意味します。これは、個人またはチームがインターネット プラットフォームを通じてコンテンツを独自に作成、編集、公開、配布できる情報媒体を指します。新聞、テレビ、ラジオなどの従来のメディアとは異なり、セルフメディアはよりインタラクティブでパーソナライズされており、誰もが情報の制作者および発信者になることができます。 2. セルフメディアの主な特徴と機能は何ですか? 1. 敷居が低い: セルフメディアの台頭により、メディア業界への参入の敷居が低くなり、煩わしい機材や専門チームは必要なくなりました。

PHP は、Web 開発で広く使用されているサーバー側スクリプト言語です。その主な機能は、動的な Web コンテンツを生成することです。HTML と組み合わせると、リッチでカラフルな Web ページを作成できます。 PHP は強力で、さまざまなデータベース操作、ファイル操作、フォーム処理、その他のタスクを実行でき、Web サイトに強力な対話性と機能を提供します。次の記事では、詳細なコード例を使用して、PHP の役割と機能をさらに詳しく説明します。まず、PHP の一般的な使用法である動的な Web ページの生成を見てみましょう: P

3月28日の当ウェブサイトのニュースによると、美的集団は最近、2023年の営業利益が前年比8.18%増の3,720億3,700万元、上場企業の株主に帰属する純利益は337億2,000万元を達成すると発表した。 、前年比14.10%増、1株当たり基本利益は4.93元、前年比13.59%増。美的集団は10株当たり30元の現金配当を予定していると発表、配当総額は208億元となり、親会社に帰属する純利益の61.5%以上を占め過去最高となる。史上最高の配当率。財務報告データによると、2023年の美的の3大ToB事業収益は、新エネルギーと産業技術、ロボティクスとオートメーション、スマートビルディング戦略技術で279億元(前年比29%増)、311億元となる。それぞれ人民元(前年比増加)。

「VSCode について: このツールは何に使用されますか?」 》初心者でも経験豊富な開発者でも、プログラマーとしてはコード編集ツールを使わずにはいられません。数ある編集ツールの中でも、Visual Studio Code (略して VSCode) は、オープンソースで軽量かつ強力なコード エディターとして開発者の間で非常に人気があります。では、VSCode は正確に何に使用されるのでしょうか?この記事では、VSCode の機能と使用法を詳しく説明し、読者に役立つ具体的なコード例を提供します。

モバイル Hejiaqin APP は、家族管理、インテリジェント制御、家族コミュニケーションを統合する包括的なソフトウェアです。インテリジェントで便利な操作を通じて、ユーザーにとって快適でインテリジェントで調和のとれた家庭環境を構築することを目指しています。このアプリケーションを通じて、ユーザーは自宅のさまざまなスマートデバイスを簡単に制御および管理し、スマートライフがもたらす利便性を享受できます。では、モバイル アプリと Jiaqin アプリの具体的な機能は何ですか? 詳細を知りたいユーザーは、この記事に従って詳細を確認してください。 Mobile and Jiaqin アプリの使い方チュートリアル: Mobile and Jiaqin アプリの用途は何ですか? IT の知識がなくても、簡単にネットワークを管理できます。 3. 自宅から何千マイルも離れていても、家に帰って視聴できる 4. 豊富な機能で、スマートライフを楽しむ

GateToken(GT)通貨とは何ですか? GT (GateToken) は、GateChain チェーンのネイティブ資産であり、Gate.io の公式プラットフォーム通貨です。 GT コインの価値は、Gate.io および GateChain エコロジーの発展と密接に関連しています。ゲートチェーンとは何ですか? GateChain は 2018 年に誕生し、Gate.io によって開始された新世代の高性能パブリック チェーンです。 GateChain は、ユーザーのオンチェーン資産のセキュリティを保護し、便利な分散トランザクション サービスを提供することに重点を置いています。 GateChain の目標は、エンタープライズレベルの安全で効率的な分散型デジタル資産ストレージ、配信、およびトランザクションのエコシステムを構築することです。ゲートチェーンにはオリジナルがあります
