2009-08-04 9 views
3

"スマート"なHTMLエンコーディングを行う最良の方法を探しています。例えば :HtmlEncodeが呼び出されたかのようにスマートHTMLエンコーディング

From: <a>Next >></a> to: <a>Next gt;gt;</a> 
From: <p><a><b><< Prev</b></a><br/><a>Next >></a></p> to: <p><a><b>&lt;&lt; Prev</b></a><br/><a>Next gt;gt;</a></p> 

ので、テキストの唯一の非XML/HTMLの一部をコード化されるだろう。

提案がありますか?

EDIT:これはできるだけ軽量である必要があります。入力テキストは、HTMLエンコーディングを知らないユーザーからのものです。

+2

スマートは "HTMLを書く"または "プレーンテキストを書き込む"ことです - 文字列のどの部分がHTMLであり、HTMLで特別な意味を持つ文字を使用するテキストをヒューリスティックに決定しようとしていますか? 100%の信頼性と関係がある)。 – Quentin

+0

はい私は完璧な解決策を探していません。 HTMLタグを使ってテキストを挿入するオプションがあります。しかし、>>などのHTMLではないものを挿入するために使用されます。だから私は最終的な内容がOKであることを保証するように努めなければならない。ユーザーに>と<を代わりに使用する必要があることを説明するのは非常に難しいです。 – Drejc

答えて

-4

おそらく、このために良い正規表現を作成しようとします。あなたはコードの背後にある(C#)か、JavaScriptを使ってクライアント側でこれをやっていますか?

http://www.regular-expressions.info/

+0

正規表現を使用して非正規データを解析しようとするのは、これを実行する最善の方法ではありません。 DOMを直接操作するのが最善の方法ですが、これは既に述べられています。 – Xetius

6

はい:あなたのソースコードにない史上書き込みHTMLを行います。 DOMのようなAPIを使用して、エンコードの問題をすべて処理してください。

+0

もちろん、このコンテンツがすでに存在し、ジェネレータを変更できない場合は、コンテンツを自分で操作しようとしています。あなたは、字句解析の何らかの形を試したいかもしれません。どのような状況においても、これを正規表現で試してはいけません。少なくとも、あなたの正気を維持したいのではない。 – Xetius

2

ソリッドで信頼性の高いC#ソリューション(重量級)が必要な場合は、HTML Agility Pack libraryを使用します。その後、ノードを反復し、HTMLエンコードすることができます。これは、正規表現よりも少し弾丸的ですが、明らかにより強烈です。

クライアント側で実行する場合は、JQueryを使用します。 Encode HTML entities with jQueryを参照してください。

0

おそらく間違った問題を解決しようとしています。 (私は、これはあなたが聞きたいものではありません知っている。)

をユーザーがHTMLにエンコードされていない>><<を書き込むことが許可されている場合は、おそらく、彼らはまた、<>または<b>を書くことができるようになり、その場合に方法はありませんテキストとマークアップを確実に区別することができます。 (XSS攻撃の脆弱性に気をつけてください)

実際にテキストを傍受してにエンコードする前に、をHTMLに挿入します。おそらく問題につながるワークフローについて説明する必要があります。それを解決するにはより良い方法が必要です。

コメントに応じて編集:同時にテキストまたはHTMLのどちらかになる入力を確実にエンコードする方法はありません。とにかく、ユーザーが生のHTMLを入力するのに十分な技術を持っていれば、おそらくエンティティを書くことができます。そうでなければ、生のHTMLを最初に入力すべきではありません。 HTML入力が上級ユーザーのみの場合は、入力がテキストかHTMLかを示すチェックボックスを付けることができます。しかし、おそらくリッチテキストエディタの使用を検討する必要があります。

+0

私は、HTMLタグを入力してテキストの書式を設定できるようにする機能要求を持っています。以前はテキストは常にエンコードされていて、ユーザーは非HTMLテキストをフィールドに書き込むために使用されていました。今私は例として与えたいくつかの入力があることを知っている。それがXMLを壊すのを防ぐために、私はそれを "修正"する方法を探しています。私がそれを制御できないので、入力を傍受することはオプションではありません。 – Drejc

+0

@Drejc:元の質問にこの情報を追加してください。 – JacquesB

0

あなたはtidy.netの使用について考えましたか?あなたはそれにあなたのユーザーの入力を投げ、それが来るものを見ることができます、それは非常に、非常に、非常に良いとあなたが実際に欲しいものにゴミを回す。そのDLLとすべてのマネージドコードは、あなたが簡単にそれをボルトで入れることができるように信じています。

正規表現のバンドワゴンについては、私は同意しません。データが限定されている場合(あなたがそうであるかどうかを言わない場合)、少なくともそれを掃除しないと入力文字列を検証しようとするためのいくつかのルールを考え出すことができます。私はあなたのデータが文字通り何かになる可能性があると思うが、あなたは他の何かを使うのが良いだろうが、完全に排除すべきではない。

関連する問題