0

htmlagility pack を使用して html 文字列を解析し、特定のパターンをリンクに変換しています。

HTML 文字列とパターン「mystring」が与えられます。hrml 文字列内のこのパターンの出現箇所を に置き換える必要があります<a href="/mystring.html>mystring</a>。ただし、2 つの例外があり

ます。1. パターンが既にアンカー タグ内にある場合は、パターンを置換しないでください。つまり、直接の親またはレベルの親をアンカー タグにすることはできません。例: <a href="google.com><span>mystring</span><\a>
2. href 内にあってはなりません。例のため<a href="mystring">に。

  • 入力文字列:"<li><span>mystring test</span></li><li><a href='#'><span>mystring</span></li</li>"
  • 期待される出力:"<li><span><a href="/mystring.html>mystring</a> test</span></li><li><a href='#'><span>mystring</span></li</li>"

私はhtmlagilitypackを使用して、この文字列をhtmlドキュメントとしてロードし、すべてのテキストを取得し、そのレベルの親がアンカーではないかどうかを調べて置き換えています。すべてがシンプルでうまく機能しました。しかし、ここで問題があります。

入力文字列が次のようなものである場合"li><span>mystring test < 10 and 5</span></li>"、問題があります。Htmlagility パーサーは、小なり記号を html 特殊文字と見なし、「< 10 と 5」を html タグと見なして、次のようなものを生成します。

< 10="" and="" 5=""> (値が空の属性)。

htmlagilityparser を使用してこれを回避する方法はありますか? 一歩下がって正規表現を使用する必要がありますか? その場合、任意のレベルのアンカー例外をどのように処理すればよいですか? この問題に対するより良いアプローチはありますか?

4

2 に答える 2

1

外部 HTML タグの使用<は無効です。&lt;代わりにエンティティを使用してください。

編集: 入力文字列を制御できない場合は、「<」を置き換えてみてください:

inputhtml = inputhtml.Replace("< ", "&lt; ");

その他のエラーがある場合は、MSHTML COM DLL のインポートを試すことができます。COM dll「Microsoft HTML オブジェクト ライブラリ」を参照してください。

于 2013-09-14T09:12:04.033 に答える