在C#中获取图片SRC的正则表达式

29

我正在寻找一个正则表达式,以分离img的src值。 (我知道这不是最好的做法,但这是我在这种情况下必须要做的)

我有一个包含简单HTML代码、一些文本和一个图像的字符串。我需要从该字符串中获取src属性的值。到目前为止,我只能够分离整个标签。

string matchString = Regex.Match(original_text, @"(<img([^>]+)>)").Value;

在 img 标签上运行第二个正则表达式以获取 src 属性。 - simendsjo
3
必须提供到这个相关回答的链接 - Cameron
8个回答

53
string matchString = Regex.Match(original_text, "<img.+?src=[\"'](.+?)[\"'].*?>", RegexOptions.IgnoreCase).Groups[1].Value;

1
如果Src是Image的第一个属性,这个正则表达式才能起作用。如果Src位于ID或其他属性之后,则无法工作。 - Unknown Coder
2
@ShreekumarS 为什么?在 img 和 src 之间有一个 .+?,所以可能会有各种字符... - Hinek
3
иҝҷдёӘжІЎй—®йўҳгҖӮRegex.Match(original_text, "<img.*?src=[\"'](.+?)[\"'].*?>", RegexOptions.IgnoreCase).Groups[1].Value; пјҲзҝ»иҜ‘з»“жһңпјҡиҝҷж®өд»Јз ҒжӯЈеёёе·ҘдҪңгҖӮпјү - Unknown Coder
我会让它变得更加贪婪,使用<img.*src="'["'].*>而不是.+?,特别是对于最后一个,否则您总是需要至少1个字符。如果他们在src属性之后立即关闭img标记,则可能不存在该字符。 - Christophe Geers
把这个表达式写得太贪婪了不是一个好主意,如果有多个img元素怎么办?你的表达式可能会将所有这些元素作为一个匹配捕获。但你对我的表达式结尾的修改是正确的,我将其改为.*?以允许元素在src属性之后结束。第一个.+?仍然是正确的,img和src之间必须至少有一个字符:空格... - Hinek

15

我知道你说必须使用正则表达式,但如果可能的话,我真的希望给这个开源项目一个机会:HtmlAgilityPack

它非常易于使用,我刚刚发现它并且它已经帮助了我很多,因为我正在做一些比较复杂的HTML解析。它基本上允许你使用XPath获取元素。

他们的示例页面有点过时,但API非常容易理解,如果您稍微熟悉XPath,您将在短时间内掌握它。

您的查询代码大致如下(未编译的代码):

 List<string> imgScrs = new List<string>();
 HtmlDocument doc = new HtmlDocument();
 doc.LoadHtml(htmlText);//or doc.Load(htmlFileStream)
 var nodes = doc.DocumentNode.SelectNodes(@"//img[@src]"); s
 foreach (var img in nodes)
 {
    HtmlAttribute att = img["src"];
    imgScrs.Add(att.Value)
 }

我尝试过这个,但是看起来 HtmlAgilityPack 的 API 已经改变了。我已经在这个问题的帖子里发布了一种替代解决方案。 - eflles

7

我尝试了Francisco Noriega建议的方法,但似乎HtmlAgilityPack的API已经被修改了。以下是我的解决办法:

        List<string> images = new List<string>();
        WebClient client = new WebClient();
        string site = "http://www.mysite.com";
        var htmlText = client.DownloadString(site);

        var htmlDoc = new HtmlDocument()
                    {
                        OptionFixNestedTags = true,
                        OptionAutoCloseOnEnd = true
                    };

        htmlDoc.LoadHtml(htmlText);

        foreach (HtmlNode img in htmlDoc.DocumentNode.SelectNodes("//img"))
        {
            HtmlAttribute att = img.Attributes["src"];
            images.Add(att.Value);
        }

2
你应该在 SelectNodes 调用中真的放入 //img[@src](或在获取att.Value之前检查其是否存在)。并且要么检查结果是否为null,要么在SelctNodes调用中添加 ?? new HtmlNodeCollection(null);。否则,你会收到 NullReferenceException - jessehouwing
1
你可以编辑原始答案,删除其中包含的错误,而不是添加新答案。 - jessehouwing

3
这应该捕获所有的img标签,只需src部分,无论它在哪里(在class之前或之后等),并支持html/xhtml :D
<img.+?src="(.+?)".+?/?>

2
您需要的正则表达式应该是这样的:

正则表达式应该如下:

(<img.*?src="([^"])".*?>)

希望这能帮到你。

1

你也可以使用后顾之忧来完成它,而无需提取出一个组

(?<=<img.*?src=")[^"]*

记得在必要时转义引号


0
这是我用来从字符串中获取标签的方法:
</? *img[^>]*>

-1

这是我使用的一个:

<img.*?src\s*?=\s*?(?:(['"])(?<src>(?:(?!\1).)*)\1|(?<src>[^\s>]+))[^>]*?>

好的一点是它与以下任何一个匹配:

<img src='test.jpg'>
<img src=test.jpg>
<img src="test.jpg">

它还可以匹配一些意外情况,比如额外的属性,例如:

<img src = "test.jpg" width="300">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接