1

次のような文字列のHTMLがあります。

<div id="control">
    <a href="/xx/x">y</a>
    <ul>
        <li><a href="/C003Q/x" class="dw">x</a></li>
        <li><a href="/C003R/xx" class="dw">xx</a></li>
        <li><a href="/C003S/xxx" class="dw">xxx</a></li>
    </ul>
</div>

これを次のように変更したいと思います。

<div id="control">
    <a data-href="/xx/x" ><span>y</span></a>
    <ul>
        <li><a data-href="/C003Q/x" class="dw"><span>x</span></a></li>
        <li><a data-href="/C003R/xx" class="dw"><span>xx</span></a></li>
        <li><a data-href="/C003S/xxx" class="dw"><span>xxx</span></a></li>
    </ul>
</div>

正規表現について聞いたのですが、それを使用してアドレスタグ内の何かを変更し、同時にhrefを変更する方法がわかりません。正規表現を2回使用する必要がありますか?使用している正規表現の内部を変更でき<a ... >...</a>ますか、それともC#でより簡単な方法がありますか?

4

3 に答える 3

2

正規表現は、一般に、HTMLの解析には適していませんが、よく知られていて構造化されたHTML(つまり、解析しようとしているものを正確に知っている)は例外です。

使用できるHTMLパーサーがあります。HTMLAgilityPackは人気のあるオプションであり、CsQueryもあります。


Html Agility Pack(HAP)とは正確には何ですか?

これは、読み取り/書き込みDOMを構築し、プレーンXPATHまたはXSLTをサポートするアジャイルHTMLパーサーです(実際には、XPATHまたはXSLTを理解して使用する必要はありません。心配しないでください...)。これは、「Web外」のHTMLファイルを解析できるようにする.NETコードライブラリです。パーサーは、「現実世界」の不正な形式のHTMLに対して非常に寛容です。オブジェクトモデルは、System.Xmlを提案するものと非常に似ていますが、HTMLドキュメント(またはストリーム)用です。


CsQuery-.NET 4用の.C#jQueryポート

CsQueryは、.NET 4用のjQueryポートです。これは、すべてのCSS2およびCSS3セレクター、jQueryのすべてのDOM操作メソッド、および一部のユーティリティメソッドを実装します。jQueryテストスイートの大部分(1.6.2以降)はC#に移植されています。

于 2012-12-20T10:04:53.587 に答える
1

正規表現replaceを使用できます。括弧を使用して、一致するテキストの値をキャッチし$1$2et.cを使用します。置換文字列の値を使用するには:

str = Regex.Replace(
  str,
  "<a href=\"(.+?)\" class=\"dw\">(.+?)</a>",
  "<a data-href=\"$1\" class=\"dw\"><span>$2</span></a>"
);

注:HTMLコードの形式がまったく同じでない場合、置換は機能しません。たとえば、アンカータグに別の属性がある場合、または属性の順序が逆になっている場合、パターンは一致しません。

于 2012-12-20T10:05:18.033 に答える
0

を使用したくない場合はRegex、次のようにすることができます。

string newString = oldString.Replace("dw\">", "dw\"><span>")
                            .Replace("</a", "</span></a");
于 2012-12-20T11:08:44.987 に答える