Переписать URL из пользовательского HTML - PullRequest
1 голос
/ 13 марта 2009

Я использую один редактор WYSIWYG в небольшой CMS. Он позволяет пользователям загружать файлы, изображения и т. Д. Если я добавлю изображение с именем 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 ]

1 голос
/ 13 марта 2009

Я не уверен, что версия регулярного выражения имеет какие-либо характеристики, которые вы упоминаете в этом случае.

Тем не менее, вы можете сделать:

    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);
    }

Если вы продолжаете с этим, рефакторинг его, чтобы один раз создать экземпляр регулярного выражения с опцией компиляции (так как partPath и fullPath не изменятся).

Также рассмотрите возможность избежать всего этого, определив веб-сайт с альтернативным портом, чтобы он был просто корневым URL.

0 голосов
/ 13 марта 2009

Позволяет ли ваш редактор WYSIWYG настраивать базовый URL, например, чтобы пути к изображениям могли использовать относительные пути? Я думаю, что FCKEditor имеет что-то вроде FCKConfig.BaseHref в своем конфигурационном файле, который делает что-то вроде этого.

В качестве альтернативы вы можете запустить сайт как корневой сайт с помощью веб-сервера ASP.NET 2.0? Тогда вам не придется беспокоиться о переписывании путей к изображениям, поскольку вы можете просто использовать пути из корня сети.

0 голосов
/ 13 марта 2009

Храните локальный корневой путь отдельно от изображений. Для каждого изображения сохраните относительный путь к этому изображению.

При локальном отображении изображений используйте локальный корень, объединенный с относительным путем. При публикации на удаленном сервере вы добавляете удаленный корень в относительный путь.

...