gpt4 book ai didi

c# - 在 HTML 中查找内容并替换它

转载 作者:太空宇宙 更新时间:2023-11-03 19:44:10 26 4
gpt4 key购买 nike

我目前正在将内容从一个 CMS 导出/导入到另一个 CMS。

我已经导出了。我正在将旧 CMS 中的所有内容导出到 XML 文件,保留文档的结构等。导入也已到位,映射到新的 PageTypes,映射文本字段等。我还将所有媒体从旧 CMS 导出和导入到新 CMS。

我唯一关心的是在每个页面的 RichText 字段中处理内部链接和指向媒体项的链接。

因此,每个页面都包含一个页眉、一些通用信息和一个包含 HTML 页面内容的 RichTextField。此字段可以包含指向同一站点内其他页面的链接、内部链接和指向媒体项目的链接。

我的问题是,我怎样才能找到这些,并将它们映射到我的新结构。

所有内部链接如下所示:<a href="/mycms/~/link.aspx?_id=D9423CEFED254610A5DC6B096A297E17&amp;_z=z">...</a> (也许某些链接上可能有更多属性,例如 style=".."class=".." 等。ID,是对旧 CMS 的 ID 的引用,其长度始终为 32 个字符。

媒体项(图像)可能如下所示:<img src="/mycms/~/media/B1FB91AC357347BD84913D56B8791D03.ashx" alt="" width="690" height="202" /> .同样在这里,id 的长度始终为 32 个字符。

在导入过程中,我生成了一个 json 文件,其中包含旧 CMS 中的所有 mediaId,并将其映射到新 CMS 中的新 ID。所以它看起来像这样;

{
"{0CFBBD0A-9156-4AD9-8A8A-7D30B2D7213B}":1095,
"{BE9BEAAA-F04D-42DA-B52A-44B4B31A389E}":1096,
etc.
}

请注意旧 CMS ID 的 ID 格式与链接和媒体中使用的格式不同。去掉花括号和破折号,它就会匹配。

解决此问题的最佳方法是什么?我猜 RegEx 是可行的方法 - 但它会/会是什么样子?

谢谢:)

最佳答案

你最好的选择是使用类似 HtmlAgilityPack 的东西.纯 Regex 通常过于粗糙,无法成功解析 HTML……并非不可能完成的任务,但比使用 HtmlAgilityPack 更难。

The post Eric 在他的评论中链接是 StackOverflow 历史上臭名昭著的评论,那里的多个回复详细说明了为什么不推荐使用 Regex 解析 HTML 的方法。根据我的个人经验提供 TLDR:HTML 页面通常充满小“错误”。例如,您通常会有 <img>未正确关闭的标签(如 <img /> )。确定性匹配和替换也相当困难。

因此,尝试使用正确的工具来完成工作 - 在这种情况下,正确的工具是 HtmlAgilityPack .

关于 HtmlAgilityPack 的使用 - they have good documentation .在你的情况下,你可能想看看 Replace Child功能。为了从他们的文档中重现示例,这里使用了测试 HTML:

<body>
<h1>This is <b>bold</b> heading</h1>
<p>This is <u>underlined</u> paragraph</p>
</body>

要操纵它,并替换 <h1>你会做的节点:

var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(html); // where html = @"content previously mentioned"

var htmlBody = htmlDoc.DocumentNode.SelectSingleNode("//body");
HtmlNode oldChild = htmlBody.ChildNodes[1];
HtmlNode newChild = HtmlNode.CreateNode("<h2> This is h2 new child heading</h2>");

htmlBody.ReplaceChild(newChild, oldChild);
// now htmlBody has <h2> node instead of old <h1>

在您的情况下,您可能希望使用 SelectNodes而不是使用 XPath 的 SelectSingleNode ,您将定位要替换的元素。列表中包含这些元素后,您将迭代它们并根据条件替换内容。

要记住一件事 - 由于您的 ID 非常冗长,有 32 个字符,您可能会使用纯字符串搜索来匹配它们。所以如果您不是针对某些 HTML 元素,而是针对 ID - 那么您甚至不需要使用 HtmlAgilityPack 或 Regex - 做简单的 String.Replace("OLDUID", "NEWUID") .

关于c# - 在 HTML 中查找内容并替换它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48450151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com