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>

我听说过 regex,但我不确定如何使用它来更改地址标签内的内容并同时更改 href。我是否需要使用 regex 两次,我可以更改<a ... >...</a>using regex 的内部,还是使用 C# 有更简单的方法?

4

3 回答 3

2

通常,正则表达式不适合解析 HTML,例外是众所周知且结构良好的 HTML(即,您确切知道要解析的内容)。

您可以使用一些 HTML 解析器 - HTML Agility Pack是一个流行的选项,还有CsQuery


什么是 Html Agility Pack (HAP)?

这是一个敏捷的 HTML 解析器,它构建一个读/写 DOM 并支持普通的 XPATH 或 XSLT(实际上你不必了解 XPATH 或 XSLT 就可以使用它,不用担心......)。它是一个 .NET 代码库,允许您解析“网络之外”的 HTML 文件。解析器对“真实世界”格式错误的 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

您可以使用正则表达式替换。使用括号来捕获匹配文本中的值,并使用$1$2。使用替换字符串中的值:

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

如果你不想使用 a Regex,你可以这样做:

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