Regex来解析和替换C#/.NET中的img src
本文关键字:NET 中的 img src 替换 Regex | 更新日期: 2023-09-27 18:26:47
Ahoy,
我有个问题,看;我有这样的字符串:
<img width="594" height="392" src="/sites/it_kb/SiteAssets/Pages/exploding%20the%20VDI%20vDesktop/VDI3.PNG" alt="" style="margin:5px;width:619px;height:232px" />
它们的格式不一致。
我需要像这样解析字符串,并返回以下内容:
<img width="594" height="392" src="/exploding%20the%20VDI%20vDesktop-VDI3.PNG" alt="" style="margin:5px;width:619px;height:232px" />
更改:
- 删除图像文件所在的直接目录之外的所有内容
- 不要将该目录作为子目录,而是将其置于文件名之前
因此,如果文件当前位于/blaba/bla/aah/spickle.png
那么我想让IMG SRC属性说pickles-pickle.png
现在,我一直在尝试用regex做这件事,但3个小时后,我发现了一些关于自己的东西。。。我的正则表达式很糟糕。我可能会在这里呆上几个星期,但我永远不会有任何进展。
因此,我向这个优秀的社区请求两件事:
- 你会怎么做?正则表达式是正确的答案吗?我需要能够解析IMG标签中的任何SRC属性(无论它们是否具有高度/宽度或其他属性)
- 你建议我使用哪些资源来学习.NET中的正则表达式
现在对于手头的问题,我想我可以做一个字符串。替换我…
- 找到IMG标记,并获取周围'<'的索引和'>'
- 在这两个实例之间查找"SRC="answers"(空格)的索引
- 在src索引和space索引之间查找"/"的最后一个索引
- 在src索引和space索引之间查找倒数第二个索引"/"
- 替换。。。呃不,删除。。。"/"倒数第二个实例之前的所有内容
- 。。。字符串。将剩余的"/"替换为"-"
- 。。。。I。我想就这样吧
但是该死的,这太难看了。正则表达式会更漂亮,你不觉得吗?
有什么建议吗?
注意:我把它标记为"家庭作业",但它不是家庭作业。我在下班后自愿工作,为公司节省20万美元。对我来说,这简直是一个令人难以置信的难题的最后一块。当然,我看不到20万美元中的一分钱,但我做得很好。
要获得标签,我建议使用HtmlAgilityPack。这比在整个HTML页面上执行regex更安全。
使用类似的东西来获得图像节点:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
var imgs = doc.DocumentNode.SelectNodes("//img");
使用类似的东西来获取/设置属性:
foreach (var img in imgs)
{
string orig = img.Attributes["src"].Value;
//do replacements on orig to a new string, newsrc
img.SetAttributeValue("src",newsrc);
}
那么,你应该做什么样的替换呢?我同意使用Regex要优雅得多。像这样的事情终究是为了什么!
像这样的东西应该可以做到:
string s = @"/sites/it_kb/SiteAssets/Pages/exploding%20the%20VDI%20vDesktop/VDI3.PNG";
string n = Regex.Replace(s,@"(.*?)'/([^'/]*?)'/([^'/]*?)$",@"/$2-$3");
一些你可以用来学习C#Regexing:的资源
dotnetperls Regex.Match
MSDN:Regex.Match方法
MSDN Regex备忘单
(?<=src=)"[^" ]*'/(?=[^'/"]*'/)
试试这个。更换为empty string
。
http://regex101.com/r/dZ1vT6/50
必须警告你这是一种黑客行为。不应使用regex解析Html。
更换此
(?i)(?<=<img's['s'S]*?src=")(?:[^"]*'/)+(?=[^"]*'/)([^'/]*)'/([^"]+)
收件人:
/$1-$2