C# 在大量HTML文件中重写动态URL

C# 在大量HTML文件中重写动态URL,c#,replace,C#,Replace,我正在进行一个从传统内部网到新产品的迁移项目 所有的html文件都存储在一个文件系统中,但会被放入一个数据库,我已经清理了很多html,现在我需要做的是重写URL,以便它们继续工作 目前,我们有数千个带有查询字符串链接的文件,如下所示: <a href="site.get?section&PAGE277">Hanoi</a> <a href="site.get?section&PAGE278">Ho Chi Minh City</a>

我正在进行一个从传统内部网到新产品的迁移项目

所有的html文件都存储在一个文件系统中,但会被放入一个数据库,我已经清理了很多html,现在我需要做的是重写URL,以便它们继续工作

目前,我们有数千个带有查询字符串链接的文件,如下所示:

<a href="site.get?section&PAGE277">Hanoi</a>
<a href="site.get?section&PAGE278">Ho Chi Minh City</a>
<a href="site.get?section&PAGE245">Hong Kong</a>

我需要一些东西来改变所有链接,使其看起来像:

<a href="/sites/pages/PAGE277.aspx">Hanoi</a>
<a href="/sites/pages/PAGE278.aspx">Ho Chi Minh City</a>
<a href="/sites/pages/PAGE245.aspx">Hong Kong</a>

该数字将始终为三位数

我已经在HTML中做了很多其他的转换,但是在这个转换上遇到了困难

有什么想法吗

提前谢谢

编辑:页面将迁移到SharePoint,因此将存储在SharePoint内容数据库中供内部使用

编辑2:

这解决了问题,但能做得更整洁吗

public static string ReplacePageUrl(string content)
{
    string updatedContent = content;

    for (int i = 1; i < 1000; i++)
    {
        updatedContent = updatedContent.Replace("site.get?section&PAGE" + i.ToString("D3"),
            "href=\"/sites/pages/page" + i.ToString("D3") + ".aspx");
    }

    return updatedContent;
}
publicstaticstringreplacepageurl(字符串内容)
{
字符串updatedContent=内容;
对于(int i=1;i<1000;i++)
{
updatedContent=updatedContent.Replace(“site.get?节和页”+i.ToString(“D3”),
“href=\”/sites/pages/page“+i.ToString(“D3”)+”.aspx”);
}
返回更新的内容;
}

修改数据库并保留数据库的单个实例是非常危险的,而且可能容易出错,如果您正在修改URL,请尝试以下场景:

执行301重定向:

永久移动的HTTP响应状态代码301用于 永久重定向,表示使用URL的当前链接或记录 接收到的301永久移动响应应为 更新到响应位置字段中提供的新URL。-Wikipedia

通过这样做,你不会失去你在当前页面上的排名,也不会影响SEO

创建新内容或将其复制到另一个数据库

一旦您有了url列表,您将重定向,您可以在此数据库(新的url结构)上执行url更改,然后您可以分析和研究重定向,并在没有断开链接的情况下对此数据库进行所有必要的修改

测试重定向

  • 我建议您在产品投入生产之前测试重定向(这听起来很明显,不是吗),但请确保您正在修改本地ETC文件系统,以将应用程序的域指向127.0.0.1 ip

  • 在google上运行几个测试,将您正在测试的url模式写入google查询,如“page1.aspx?param=1”站点:yourdomain.com,然后尝试每个模式/重定向,以确保一切正常

我认为这是一种更安全的工作方式,它可以让你灵活地至少错过几个链接,而不会出现断开的链接

编辑:

如果您需要替换或修改HTML,这是您唯一关心的问题,我建议您使用您可以对HTML元素执行linq查询,执行过滤器、元素修改,这将使您的场景更加简单

大概是这样的:

var links = html.DocumentNode
           .Descendants("tr")
           .Where(tr => tr.GetAttributeValue("class", "").Contains("alt"))
           .SelectMany(tr => tr.Descendants("a"))
           .ToArray();
我建议用记事本++()替换文件中的文本

然后,您可以将“在文件中替换”函数与正则表达式一起使用

在“查找/替换”框中启用正则表达式后,替换此:

<a href="site\.get\?section&(.*)">(.*)</a>

为此:

<a href="/sites/pages/\1\.aspx">\2</a>


是否要替换html文件中的文本?是的,我正在使用StreamReader将html读入字符串,然后我从中创建一个SharePoint.aspx页面,但需要删除JavaScripts等。这不是一个问题。感谢详细回答,这是一个内部网,尽管SEO并不重要,所有页面都将创建为SharePoint页面,因此驻留在SharePoint内容数据库中我已经更新了我的答案,也许它可以帮助您完成未来的工作!