1

我在一个小 cms 中使用一个所见即所得的编辑器。它允许用户上传文件、图像等。如果我在源代码中添加名为 dog.jpg 的图像,我将得到:

<img src="/myweb/userfiles/images/dog.jpg" />

我可以将其保存到数据库并稍后在任何页面上使用它,直到我将我的站点移动到一个活动域。

myweb 是 IIS 中的虚拟目录。“/”指向根目录,在本例中为 localhost,所以我必须使用“/myweb”。但是,当我将站点上传到服务器并在那里复制数据库时,所有链接都会被破坏,因为服务器上没有“myweb”文件夹。

我的想法是用空字符串替换保存时的“/myweb”。我还必须替换编辑器为某些文件创建的完整 url。在显示时,我必须添加正确的应用程序目录。我可能会将这两个版本都保存在数据库中,并且仅在服务器更改时强制显示版本进行更新。

到目前为止,我想出了:

p = p.Replace("href=\"" + fullUrl, "href=\"").Replace("src=\"" + fullUrl, "src=\"").Replace("href=\"" + partialUrl, "href=\"").Replace("src=\"" + partialUrl, "src=\"");

这是丑陋的,难以维护且效率低下。我想更好的方法是使用正则表达式,但我不知道该怎么做。

我的问题是,任何人都可以推荐关于此的好文章、博客/论坛帖子吗?如果您有其他解决方案,那就太好了。

4

3 回答 3

1

我不确定正则表达式版本是否具有您在这种情况下提到的任何特征。

也就是说,你可以这样做:

    string ReplaceUrlPaths(string html, string partialPath, string fullPath)
    {
        var pattern = string.Format("((href|src)=\")({0}|{1})", partialPath, fullPath);
        var regex = new Regex(pattern);
        return regex.Replace(html, m => m.Groups[1].Value);
    }
    [TestMethod]
    public void TestMethod10()
    {
        var input = @"<img src=""/myweb/userfiles/images/dog.jpg"" />";
        //carefull with any special regex char in the paths
        var replaced = ReplaceUrlPaths(input, "/myweb", "/some/full/path"); 
        Assert.AreEqual(
            @"<img src=""/userfiles/images/dog.jpg"" />", 
            replaced);
    }

如果您继续这样做,请重构它以使用编译选项实例化一次正则表达式(因为 partialPath 和 fullPath 不会改变)。

还可以考虑通过定义一个具有备用端口的网站来将其作为根 URL 来避免这一切。

于 2009-03-13T04:45:17.920 回答
0

将本地根路径与图像分开存储。对于每个图像,存储该图像的相对路径。

在本地显示图像时,使用与相对路径合并的本地根。当您发布到远程服务器时,您将远程根添加到相对路径。

于 2009-03-13T03:41:26.950 回答
0

您的所见即所得编辑器是否允许您配置基本 URL,例如,以便图像的路径可以使用相对路径?我认为 FCKEditor 在它的配置文件中有类似 FCKConfig.BaseHref 的东西,它会做这样的事情。

或者,您可以使用 ASP.NET 2.0 Web 服务器将站点作为根站点运行吗?这样您就不必担心重写图像的路径,因为您可以只使用来自 webroot 的路径。

于 2009-03-13T11:21:56.017 回答