所有
我需要编写正则表达式来执行以下操作 替换
(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/ ,从而确保输出文本只包含一次域。
我是否需要使用两个不同的正则表达式执行此操作,一个用于源文本,包括域,一个不包含?或者我可以以某种方式使用条件匹配语句,结合替换表达式,将根据匹配的文本是否包含域来插入域?
我知道我可以使用自定义匹配评估器来执行此操作,但似乎在正则表达式本身内执行它可能更快/更有效。
建议/评论
答案 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);