从用户提交的HTML重写网址

时间:2009-03-13 02:51:32

标签: asp.net regex wysiwyg

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

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

我可以将其保存到数据库中,稍后在任何页面上使用它,直到我将我的网站移动到实时域名。

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

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

到现在为止,我想出了:

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

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

我的问题是,有人可以推荐好文章,博客/论坛帖子吗?如果你有其他解决方案,那很好。

3 个答案:

答案 0 :(得分: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);
    }

如果您正在进行此操作,请使用编译选项重构它以使用regex实例化一次(因为partialPath和fullPath不会更改)。

还要考虑避免这一切,方法是定义一个带有备用端口的网站,将其作为根URL。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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