2009-03-13 7 views
1

J'utilise un éditeur WYSIWYG dans un petit cms. Il permet aux utilisateurs de télécharger des fichiers, des images, etc. Si j'ajouter une image nommée dog.jpg, dans la source, je vais:Réécrire les URL de l'utilisateur soumis HTML

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

Je peux enregistrer ce à une base de données et de l'utiliser plus tard sur une page, jusqu'à ce que Je déplace mon site vers un domaine en direct. Myweb est un répertoire virtuel dans IIS.

"/" pointe vers root, dans ce cas localhost, donc je dois utiliser "/ myweb". Cependant quand je télécharge le site au serveur et copie la base de données là, tous les liens seront cassés, parce qu'il n'y a aucun dossier "myweb" sur le serveur.

Mon idée était de remplacer "/ myweb" par save avec une chaîne vide. Je dois également remplacer l'url complète, que l'éditeur crée pour certains fichiers. Sur l'affichage je devrais ajouter le répertoire d'application correct. Je voudrais probablement enregistrer les deux versions dans la base de données, et seulement sur le changement de serveur force afficher la version à mettre à jour.

Maintenant, je suis venu avec:

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

Ce qui est laid, difficile à maintenir et inefficace. Je suppose que la meilleure approche serait d'utiliser regex, mais je ne sais pas comment le faire.

Ma question est, quelqu'un peut-il recommander un bon article, blog/forum sur ce sujet? Si vous avez d'autres solutions, super.

Répondre

1

Je ne suis pas sûr que la version regex possède l'une des caractéristiques que vous mentionnez dans ce cas.

Cela dit, vous pouvez faire:

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

Si vous procédez avec cela, refactoriser instancier la regex une fois avec l'option de compilation (comme partialPath et fullPath ne changeront pas).

Pensez également à éviter tout cela, en définissant un site Web avec un port alternatif pour l'avoir comme URL racine.

+0

Votre code est ce que je cherchais. Votre conseil pour le site Web avec un port alternatif est une vraie solution, cependant :) Bien que, je pense toujours là est la possibilité pour l'utilisateur d'avoir besoin de ce nettoyage? – Milan

+0

Vous avez mentionné que vous aviez quelques chemins "complets" que vous deviez nettoyer de toute façon (je devine l'URL absolue ou un chemin de fichier).Pour un côté déjà construit qui a déjà des problèmes avec le fait de ne pas être root je ne le regarde pas à moins qu'il y ait une exigence claire de déployer vers un chemin non racine en production ... – eglasius

+0

... le site pourrait contenir des liens, des ressources (images/css/scripts) qui se cassent lors d'un déploiement dans un répertoire non root - j'évite les problèmes si je le construis, mais quand il y a déjà quelque chose en place cela peut signifier beaucoup de mises à jour – eglasius

0

Stockez le chemin racine local séparément des images. Pour chaque image, stockez le chemin relatif à cette image.

Lorsque vous affichez des images localement, utilisez la racine locale fusionnée avec le chemin relatif. Lorsque vous publiez sur le serveur distant, vous ajoutez la racine distante au chemin relatif.

+0

Je suppose que mon message n'était pas clair. J'ai dit que j'essayais déjà de faire ce que vous avez proposé, mais je suis à la recherche d'un moyen efficace. – Milan

0

Votre éditeur WYSIWYG vous permet-il de configurer l'URL de base, par ex. de sorte que les chemins vers les images peuvent utiliser des chemins relatifs? Je pense que le FCKEditor a quelque chose comme FCKConfig.BaseHref dans son fichier de configuration qui fait quelque chose comme ça.

Vous pouvez également exécuter le site en tant que site racine à l'aide du serveur Web ASP.NET 2.0? Vous n'aurez alors plus à vous soucier de réécrire les chemins d'accès aux images, car vous pourriez simplement utiliser des chemins du webroot.

Questions connexes