2009-03-13 24 views
1

小さなCMSで1台のWYSIWYGエディターを使用します。まで、投稿されたユーザーからのURLを書き直してください。

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

私はデータベースにこれを保存して、任意のページで、後でそれを使用することができます:それは私が買ってあげるソースで、画像の名前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=\""); 

は、今では私が作ってみました。私はより良いアプローチは、正規表現を使用することだと思うが、私はそれを行う方法がわからない。

私の質問は誰でも良い記事、ブログ/フォーラムの投稿をお勧めしますか?あなたが他の解決策を持っているなら、素晴らしい。

答えて

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とをフルパスが変更されないので)コンパイルオプションで一回正規表現をインスタンス化することをリファクタリング:あなたがすることができる、と述べた

また、別のポートを持つWebサイトを定義して、それをルートUrlにすることもできます。

+0

あなたのコードは私が探していたものです。代わりのポートを持つWebサイトのあなたの助言は、本当の解決策です:)しかし 私はまだ考えていますが、ユーザーがこのクリーンアップを必要とする可能性はありますか? – Milan

+0

あなたは、とにかく(絶対URLまたはファイルパスを推測しています)あなたがきれいにするために必要ないくつかの "フル"パスがあると言いました。既にルートになっていないという問題を抱えている既に構築された側のために、本番環境で非ルートパスに展開する明確な要件がない限り、私はそれを見ません... – eglasius

+0

...サイトはリンク、 images/css/scripts)を非ルートディレクトリに展開すると壊れます。ビルドしても問題は回避されますが、すでに存在する場合は、多くの更新を意味する可能性があります – eglasius

0

イメージとは別にローカルルートパスを保存します。各画像に対して、その画像への相対パスを保存します。

イメージをローカルに表示する場合は、ローカルルートをマージして相対パスを使用します。リモートサーバーに公開するときは、リモートルートを相対パスに追加します。

+0

私の投稿は明確ではないと思います。私はすでにあなたが提案したことをやろうとしていると言いましたが、私は効率的で良い方法を探しています。 – Milan

0

WYSIWYGエディタでベースURLを設定できますか?画像へのパスは相対パスを使用できますか?私はFCKEditorがFCKConfig.BaseHrefのようなものを持っていると思う。

また、ASP.NET 2.0 Webサーバーを使用してルートサイトとしてサイトを実行できますか。その後、Webルートからのパスを使用するだけで、イメージへのパスの書き換えについて心配する必要はありません。

関連する問題