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" />

更改:

  1. 删除图像文件所在的直接目录之外的所有内容
  2. 不要将该目录作为子目录,而是将其置于文件名之前

因此,如果文件当前位于/blaba/bla/aah/spickle.png

那么我想让IMG SRC属性说pickles-pickle.png

现在,我一直在尝试用regex做这件事,但3个小时后,我发现了一些关于自己的东西。。。我的正则表达式很糟糕。我可能会在这里呆上几个星期,但我永远不会有任何进展。

因此,我向这个优秀的社区请求两件事:

  1. 你会怎么做?正则表达式是正确的答案吗?我需要能够解析IMG标签中的任何SRC属性(无论它们是否具有高度/宽度或其他属性)
  2. 你建议我使用哪些资源来学习.NET中的正则表达式

现在对于手头的问题,我想我可以做一个字符串。替换我…

  1. 找到IMG标记,并获取周围'<'的索引和'>'
  2. 在这两个实例之间查找"SRC="answers"(空格)的索引
  3. 在src索引和space索引之间查找"/"的最后一个索引
  4. 在src索引和space索引之间查找倒数第二个索引"/"
  5. 替换。。。呃不,删除。。。"/"倒数第二个实例之前的所有内容
  6. 。。。字符串。将剩余的"/"替换为"-"
  7. 。。。。I。我想就这样吧

但是该死的,这太难看了。正则表达式会更漂亮,你不觉得吗?

有什么建议吗?

注意:我把它标记为"家庭作业",但它不是家庭作业。我在下班后自愿工作,为公司节省20万美元。对我来说,这简直是一个令人难以置信的难题的最后一块。当然,我看不到20万美元中的一分钱,但我做得很好。

Regex来解析和替换C#/.NET中的img src

要获得标签,我建议使用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