我的字符串中包含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。我需要两次使用正则表达式吗?我可以使用正则表达式更改<a ... >...</a>
的内部,还是使用C#更简单?
答案 0 :(得分:2)
一般来说,正则表达式not suitable for parsing HTML,例外是众所周知且结构良好的HTML(即你确切知道你要解析的内容)。
您可以使用HTML解析器 - HTML Agility Pack是一个受欢迎的选项,还有CsQuery。
什么是Html Agility Pack(HAP)?
这是一个敏捷的HTML解析器,它构建一个读/写DOM并支持普通的XPATH或XSLT(你实际上不需要理解XPATH或XSLT来使用它,不用担心......)。它是一个.NET代码库,允许您解析“out of the web”HTML文件。解析器非常容忍“真实世界”格式错误的HTML。对象模型与提出System.Xml非常相似,但对于HTML文档(或流)。
CsQuery - .C#jQuery Port for .NET 4
CsQuery是.NET 4的jQuery端口。它实现了所有CSS2&amp; CSS3选择器,jQuery的所有DOM操作方法,以及一些实用方法。大多数jQuery测试套件(截至1.6.2)已移植到C#。
答案 1 :(得分:1)
您可以使用正则表达式替换。使用括号来捕获您匹配的文本中的值,并使用$1
,$2
等。使用替换字符串中的值:
str = Regex.Replace(
str,
"<a href=\"(.+?)\" class=\"dw\">(.+?)</a>",
"<a data-href=\"$1\" class=\"dw\"><span>$2</span></a>"
);
注意:如果HTML代码没有完全相同的表单,则替换将不起作用。例如,如果锚标记中有另一个属性,或者属性顺序相反,则模式将不匹配。
答案 2 :(得分:0)
如果您不想使用Regex
,可以执行以下操作:
string newString = oldString.Replace("dw\">", "dw\"><span>")
.Replace("</a", "</span></a");