繁体   English   中英

正则表达式来解析和替换C#/。NET中的img src?

[英]Regex to parse and replace img src in C#/.NET?

嗨,

我有问题,看; 我有像这样的字符串:

<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. 不要将该目录作为子目录,而应将其放在文件名之前。

因此,如果文件当前位于/blabla/bla/blaaaaah/pickles/pickle.png

然后我要让IMG SRC属性说pickles-pickle.png

现在,我一直在尝试使用regex进行此操作,但是3个小时后,我发现了一些关于自己的信息...我对regex感到很糟糕。 我可能会在这里待上几个星期,而且我永远都找不到。

因此,我要向这个美好的社区提出两件事:

  1. 你会怎么做? 正则表达式甚至是正确的答案吗? 我需要能够解析IMG标签内的任何SRC属性(无论它们是否具有height / width或其他属性)。
  2. 您会为我推荐哪些资源来学习.NET的正则表达式?

现在针对眼前的问题,我想我可以在我的位置做一个string.replace。

  1. 找到IMG标签,并获取周围的“ <”和“>”的索引
  2. 在这两个实例之间查找“ SRC =”和“”(空格)的索引
  3. 在src和空格索引之间找到'/'的最后一个索引
  4. 在src和空间索引之间找到'/'的倒数第二个索引
  5. 替换...不是,删除...“ /”倒数第二个实例之前的所有内容...
  6. ... String。用'-'替换其余的'/'。
  7. .... I ..我想这样做吗?

但是,DAMN很难看。 正则表达式会更漂亮,您不觉得吗?

有什么建议吗?

注意:我将其标记为“家庭作业”,但这不是家庭作业。 我下班后自愿参加工作,以挽救20万英镑的公司成本。 从字面上看,这是一个(对我而言)令人费解的难题的最后一部分。 当然,我看不到这20万美分的一分钱,但是我看起来很好。

要获取标签,我建议使用HtmlAgilityPack 这比在整个HTML页面上执行正则表达式更安全。

使用类似这样的方法来获取图像节点:

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#正则表达式的一些资源:

dotnetperls正则表达式匹配

MSDN:Regex.Match方法

MSDN Regex速查表

(?<=src=)"[^" ]*\/(?=[^\/"]*\/)

试试这个。用empty string替换。

http://regex101.com/r/dZ1vT6/50

必须警告您它是一种hack.Html不应该用正则表达式解析。

取代这个

(?i)(?<=<img\s[\s\S]*?src=")(?:[^"]*\/)+(?=[^"]*\/)([^\/]*)\/([^"]+)

至:

/$1-$2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM