.NET Regex:替换链接和img src

时间:2009-09-14 17:35:51

标签: .net asp.net regex

所有

我需要编写正则表达式来执行以下操作 替换

(A)

src ="/folder/image.jpg"

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

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

(B)

href="/folder/file.zip"

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

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

我知道我可以使用

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

的替换值为

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

捕获src = ...和href = ...属性。但是,我需要根据文件扩展名进行过滤 - 只匹配有效的图像扩展名,如jpg,png,gif,并且只匹配像zip和pdf这样的href扩展名。

有什么建议吗?该问题可归纳为:修改上述表达式以仅匹配特定文件扩展名,并仅在原始网址为亲属时才允许插入域 http://www.mydomain.com/ ,从而确保输出文本只包含一次域。

我是否需要使用两个不同的正则表达式执行此操作,一个用于源文本,包括域,一个不包含?或者我可以以某种方式使用条件匹配语句,结合替换表达式,将根据匹配的文本是否包含域来插入域?

我知道我可以使用自定义匹配评估器来执行此操作,但似乎在正则表达式本身内执行它可能更快/更有效。

建议/评论

4 个答案:

答案 0 :(得分:2)

这一直出现 。 Regex不是解析非常规语法(如HTML)的合适工具。使用真正的解析器(如HTML agility pack)来执行此操作。

答案 1 :(得分:1)

以下表达式是否有效?

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

您的想法是有条件地匹配文字http://www.mydomain.com。它将作为$ 2匹配文本的一部分包含在内。如果它最初存在,它将进入被替换的字符串。

答案 2 :(得分:0)

此模式将匹配任何路径,如果您想要约束路径,可以在?/后添加它。

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

以下是一些示例代码:

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

答案 3 :(得分:0)

这个怎么样?

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