2009-09-14 8 views
-1

Tous,Regex .NET: remplacement des liens et img src

Je dois écrire une expression régulière pour effectuer les opérations suivantes remplacer

(A)

src ="/folder/image.jpg" 

ou

src="http://www.mydomain.com/folder/image.jpg" 

avec

src="/cache/getCacheItem.aspx?source_url=http://www.mydomain.com/folder/image.jpg" 

(B)

href="/folder/file.zip" 

ou

href="http://www.mydomain.com/folder/file.zip" 

avec

href="/cache/getCaccheItem.aspx?source_url=http://www.mydomain.com/folder/file.zip 

Je sais que je peux utiliser

(src|href).*?=['|\"](?<url>.*?)['|\"] 

avec une valeur de remplacement

$1="/legacy_integration/cache/getCacheItem.aspx?source_url=$2" 

pour attraper src = ... et href = ... attributs. Cependant, j'ai besoin de filtrer sur la base de l'extension de fichier - seulement correspondre à des extensions d'image valides comme jpg, png, gif, et seulement correspondre à des extensions href comme zip et pdf.

Des suggestions? Le problème peut être résumé comme suit: modifier l'expression ci-dessus pour correspondre uniquement à certaines extensions de fichier et permettre au domaine http://www.mydomain.com/ d'être inséré uniquement si l'URL d'origine était un parent, garantissant ainsi que le texte de sortie contienne le domaine une seule fois. Dois-je effectuer cette opération en utilisant deux expressions régulières différentes, une pour le texte source incluant le domaine et une autre sans? Ou puis-je utiliser en quelque sorte une instruction de correspondance conditionnelle qui, en combinaison avec une expression de remplacement, insérera le domaine ou non selon que le texte correspondant contient le domaine? Je sais que je peux le faire en utilisant un évaluateur de correspondance personnalisé, mais il semble qu'il puisse être plus rapide/plus efficace de le faire dans la regex elle-même.

Suggestions/commentaires?

+0

duplication possible de [balises ouvertes de correspondance RegEx à l'exception des balises autonomes XHTML] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – AeroX

Répondre

1

L'expression suivante fonctionne-t-elle?

Regex.Replace(url, 
@"(src|href)\s*=\s*(?:'|")((?:http://www\.mydomain\.com)?.*?(jpg|bmp|png))(?:'|")", 
"$1 - /cache/getCacheItem.aspx?source_url=$2"); 

L'idée est que vous correspondez le texte http://www.mydomain.com conditionnel. Il sera inclus dans le texte du match à 2 $. S'il était là à l'origine, il fera son chemin dans la chaîne remplacée.

0

Ce modèle va correspondre à n'importe quel chemin, si vous voulez contraindre un chemin, vous pouvez l'ajouter après le? /.

(?<pre>(?:src|href)\W*=\W*(?:"|'))(?<url>(?:http://www\.mydomain\.com)?/(?<file>[^"']+))(?<post>"|') 

Voici quelques exemples de code:

string pattern = "(?<pre>(?:src|href)\\W*=\\W*(?:\"|'))(?<url>(?:http://www\\.mydomain\\.com)?/(?<file>[^\"']+))(?<post>\"|')"; 

string test = "src =\"/folder/image.jpg\"\r\n" 
      + "src=\"http://www.mydomain.com/folder/image.jpg\"\r\n" 
      + "href=\"/folder/file.zip\"\r\n" 
      + "href=\"http://www.mydomain.com/folder/file.zip\""; 

string replacement = "${pre}/cache/getCacheItem.aspx?source_url=http://www.mydomain.com/${file}${post}"; 

test = Regex.Replace(test, pattern, replacement); 
0

Qu'en est-ce?

var reg = new Regex("(/folder/[^\"]+)"); 
Match m = reg.Match("src=\"http://www.mydomain.com/folder/image.jpg\""); 
var result = string.Format("src=\"/cache/getCacheItem.aspx? source_url=http://www.mydomain.com{0}\"", m.Groups[1].Value); 
+0

@ Espen P: Il semble que cela se traduise par des URL qui contiennent toujours http://www.mydomain.com. D'après ce que je comprends de l'OP, David souhaite que ce domaine soit inclus uniquement s'il était présent dans l'URL d'origine. –

+0

Je n'étais probablement pas clair - je veux que le domaine soit inclus ou non dans l'URL d'origine. –

2

Cela arrive tout le temps . Regex n'est pas un outil approprié pour analyser une grammaire non régulière telle que HTML. Utilisez un vrai analyseur (comme le HTML agility pack) pour ce faire.

+0

Je n'ai pas besoin d'analyser tout le HTML, juste les balises spécifiées. J'ai également le contrôle sur les données d'entrée et je peux garantir que le texte d'entrée correspond au format donné. On dirait que c'est trop pour impliquer encore un autre outil tiers ici. –

+0

Ce n'est pas exagéré, c'est la fiabilité, et peu importe que vous analysiez tout si vous en analysiez. Essayez-le, cela aidera à résoudre de nombreux problèmes, pas seulement celui-ci. – annakata

+0

Bien que j'apprécie l'approche absolument stable, cette solution particulière comme a) de travail, b) une solution temporaire qui me permet de présenter beaucoup de contenu ASP hérité dans un nouveau cadre ASP.NET, et c) de travail. Comme je l'ai dit, j'ai le contrôle sur les données d'entrée et je peux garantir que mon regex fonctionne. Si j'ai besoin d'une solution plus générale à l'avenir, je serai heureux d'explorer le pack d'agilité. Merci. =) –

Questions connexes