2017-06-05 102 views
1

这段代码应该将img src的值转换为本地路径。C#正则表达式的捕获

var matches = Regex.Replace(html, "(<[ ]*img[^s]+src=[\"'])([^\"']*)([\"'][^/]*/>)", 
    (match)=> { 
    return string.Format("{0}{1}{2}", 
     match.Captures[0], 
     HostingEnvironment.MapPath("~/" + match.Captures[1]), 
     match.Captures[2]); 
}); 

它匹配正确的整个图像标记,但只有一个捕获。我认为括号可以捕获,但似乎并不像那样工作。

我该如何写这个来获得三个捕获,中间的一个是路径?

+0

什么是你输入的字符串? – Andrey

+0

也不要使用正则表达式来解析HTML – Andrey

+0

@Andrey作为一般原则,我衷心赞同。在这种情况下,我使用HTML作为模板标记,通过html转换为pdf转换器。转换器的缺点是它不会解析资源,除非您指定绝对本地文件系统路径。在通过转换器填充HTML的代码中自动解析Web相对路径意味着我可以使用一个模板,将其呈现为浏览器可用于预览和测试的网页。 –

回答

1

尝试使用Groups Property,而不是捕捉,像这样:

var matches = Regex.Replace("<img src=\"dsa\"/>", "(<[ ]*img[^s]+src=[\"'])([^\"']*)([\"'][^/]*/>)", 
    (match)=> { 
     return string.Format("{0}{1}{2}", 
      match.Groups[1], 
      HostingEnvironment.MapPath("~/" + match.Groups[2]), 
      match.Groups[3]); 
     }); 
+0

是的,我刚刚发现了这个。那么什么是捕获,因为这是群体?如果有四个图像标签,会有四个图像,那么这是一个什么样的图像? –

+1

[这篇文章](https://stackoverflow.com/questions/3320823/whats-the-difference-between-groups-and-captures-in-net-regular-expression)有一些很好的答案。 –