HTML文字列内のHTMLエンティティと等価に>変換
-
23-08-2019 - |
質問
私は、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">>
もう一つの問題は、上記の式は試合がグループ1であるという事実を除いて結構です非キャプチャグループを使用しています私はグループ1に置き換えると保存を行う方法をかなりよく分からないということです試合の残りの部分。 MatchEvaluatorは本当にトリックをしない、または多分私はちょうど今、それを想像することはできませんことが表示されます。
私は私の正規表現は、いくつかのlovin'で行うことができます疑います。
誰でも任意の鮮やかなアイデアがありますか?
解決
トリックはのすべてをキャプチャすることです。の対象ではありません、そして背面に沿って、このような変更されたテキスト、とでそれをプラグインます:
Regex.Replace(str, @"\G((?>[^<>]+|<[^>]*>)*)>", "$1>");
しかし、アンソニーさん、右:テキストノードで直角ブラケットがすべての問題を引き起こすことはありません。そして、正規表現でHTMLを合わせることは難しいです。例えば、コメントやCDATAはとても強力な正規表現は、特にそれらにマッチしなければならない、実質的に何かを含めることができます。
他のヒント
なぜあなたはこれをしたいですか? >どのような害をやっていますか?私が遭遇した最もパーサは、それが実体にエスケープする必要なしに独自に>にはかなり満足している。
また、それはこれがあなたのコントロール下にあるので、場合、あなたがそこに対処を検討する必要があり、適切にHTMLマークアップを含む文字列でそれらを連結する前にHtmlUtilty.HtmlEncodeとコンテンツの文字列をエンコードするために、より適切であろう。
たぶん、あなたのための変換の世話をする必要がありますXMLパーサにあなたのHTMLを読みます。
あなたはHTMLタグの内側に>文字について話している、(同様にJavaののinnerText中)、またはHTMLタグのarguementsリストで?
あなただけのかなり簡単であるべき開閉タグの間のテキストを、サニタイズしたい場合。ただ、いずれの>文字を見つけ、&GTと交換;。 (私も&LTタグでそれを行うだろう)が、HTMLエンジンはあなたのためにこれの世話をする必要がありますレンダリング...
あなたがサニタイズしようとしている、そして多分私達それのための最善の解決策を見つけるものの例を挙げるます。
ラリー
あなたはXMLドキュメントに文字列を読み込み、値を見て、値の>
で>
を置き換えることができます。これは再帰的には、文書内の各ノードに入るが、それを行うにはあまりにも難しいことではありませんが必要になります。
Steve_Cは、あなたがこの正規表現を試してください。これは、キャプチャを参照1における任意のHTMLタグを与えるだろう、とタグの間のテキストは、ちょうどそれが役立つかもしれない場合にはそこにそれを投げ、私は完全にこれをテストしていないキャプチャ2に格納されます。
<([A-Z][A-Z0-9]*)[^>]*>(.*?)</\1>