4

HTMLタグを含むHTMLの文字列内で、>文字のすべてのインスタンスをHTMLエンティティに相当する>に変換しようとしています。これに対する解決策を得ることができた最も遠いのは、正規表現を使用することです。

これが私がこれまでに持っているものです:

        public static readonly Regex HtmlAngleBracketNotPartOfTag = new Regex("(?:<[^>]*(?:>|$))(>)", RegexOptions.Compiled | RegexOptions.Singleline);

私が抱えている主な問題は、HTML タグの一部ではない単一の > 文字を分離することです。レンダリング用に HTML を保持する必要があるため、既存のタグを変換したくありません。> 文字を変換しないと、不正な形式の HTML が生成され、ブラウザーでレンダリングの問題が発生します。

これは、解析するテスト文字列の例です。

"Ok, now I've got the correct setting.<br/><br/>On 12/22/2008 3:45 PM, jproot@somedomain.com wrote:<br/><div class"quotedReply">> Ok, got it, hope the angle bracket quotes are there.<br/>><br/>> On 12/22/2008 3:45 PM, > sbartfast@somedomain.com wrote:<br/>>> Please someone, reply to this.<br/>>><br/>><br/></div>"

上記の文字列では、HTML タグの一部である > 文字を > に変換する必要はありません。したがって、この:

<div class"quotedReply">>

これになるはずです:

<div class"quotedReply">&gt;

もう 1 つの問題は、上記の式が非キャプチャ グループを使用していることです。これは、一致がグループ 1 にあるという事実を除いては問題ありません。マッチ。MatchEvaluator は実際にはそのトリックを実行していないように見えます。または、今のところ想像できないだけかもしれません。

私の正規表現は、愛情を込めて行うことができると思います。

誰にも明るいアイデアはありますか?

4

6 に答える 6

4

なぜこれをしたいのですか?> はどのような害を及ぼしていますか? 私が遭遇したほとんどのパーサーは、エンティティにエスケープする必要がなく、それ自体で > に非常に満足しています。

さらに、コンテンツ文字列を HTML マークアップを含む文字列と連結する前に HtmlUtilty.HtmlEncode で適切にエンコードする方が適切です。

于 2008-12-23T22:50:44.250 に答える
3

秘訣は、ターゲットではないものをすべてキャプチャしてから、次のように、変更されたテキストと一緒にプラグインし直すことです。

Regex.Replace(str, @"\G((?>[^<>]+|<[^>]*>)*)>", "$1&gt;");

しかし、Anthonyの権利:テキストノードの直角括弧は問題を引き起こさないはずです。また、HTMLと正規表現を一致させるのは難しいです。たとえば、コメントとCDATAには実質的に何でも含めることができるため、堅牢な正規表現はそれらと具体的に一致する必要があります。

于 2008-12-23T23:15:46.023 に答える
1

たぶん、HTMLをXMLパーサーに読み込んで、変換を処理する必要があります。

于 2008-12-23T22:23:08.033 に答える
0

HTMLタグ内の>文字(JavaのinnerTextのように)、またはHTMLタグの引数リストについて話しているのですか?

開始タグと終了タグの間のテキストをサニタイズするだけの場合は、かなり単純なはずです。> charを見つけて、&gt;に置き換えてください。(私も&ltタグを使用して行います)が、HTMLレンダリングエンジンがこれを処理する必要があります...

あなたが消毒しようとしているものの例を挙げてください、そして多分私たちはそれのための最良の解決策を見つけます。

ラリー

于 2008-12-23T22:23:33.603 に答える
0

文字列をXMLドキュメントに読み込んで値を確認し、値のをに置き換えて>ください&gt;。これには、ドキュメント内の各ノードに再帰的にアクセスする必要がありますが、それを行うのはそれほど難しいことではありません。

于 2008-12-23T22:23:59.153 に答える
0

Steve_C、この正規表現を試してみてください。これにより、参照1のHTMLタグがキャプチャされ、タグ間のテキストがキャプチャ2に保存されます。これは完全にはテストしていません。役立つ場合に備えて、そこに捨てるだけです。

<([A-Z][A-Z0-9]*)[^>]*>(.*?)</\1>
于 2008-12-23T22:33:15.877 に答える