Регулярное выражение для получения SRC изображений в C # - PullRequest
21 голосов
/ 23 ноября 2010

Я ищу регулярное выражение, чтобы изолировать значение src для img.(Я знаю, что это не лучший способ сделать это, но это то, что я должен сделать в этом случае)

У меня есть строка, которая содержит простой HTML-код, текст и изображение.Мне нужно получить значение атрибута src из этой строки.До сих пор мне удавалось выделить только весь тег.

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

Ответы [ 8 ]

43 голосов
/ 23 ноября 2010
string matchString = Regex.Match(original_text, "<img.+?src=[\"'](.+?)[\"'].*?>", RegexOptions.IgnoreCase).Groups[1].Value;
12 голосов
/ 23 ноября 2010

Я знаю, вы говорите, что должны использовать регулярные выражения, но если возможно, я бы действительно дал шанс этому проекту с открытым исходным кодом: HtmlAgilityPack

Это действительно удобно, я только что обнаружил это, и оно мне очень помогло, так как я занимался более сложным html-анализом. Это в основном позволяет вам использовать XPATHS, чтобы получить ваши элементы.

Их примерная страница немного устарела, но API-интерфейс действительно прост для понимания, и если вы немного знакомы с xpaths, вы сможете обойти это сейчас

Код для вашего запроса будет выглядеть примерно так: (не скомпилированный код)

 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)
 }
6 голосов
/ 06 апреля 2012

Я попробовал то, что предложил Франциско Норьега, но похоже, что API для HtmlAgilityPack был изменен. Вот как я это решил:

        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 голосов
/ 23 ноября 2010

Регулярное выражение, которое вы хотите, должно выглядеть следующим образом:

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

Надеюсь, это поможет.

1 голос
/ 23 ноября 2010

Вы также можете использовать взгляд, чтобы сделать это без необходимости вытаскивать группу

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

не забудьте экранировать кавычки при необходимости

1 голос
/ 23 ноября 2010

Это должно захватывать все теги img и только часть src независимо от того, где он находится (до или после класса и т. Д.) И поддерживает html / xhtml: D

<img.+?src="(.+?)".+?/?>
0 голосов
/ 24 июля 2017

Вот тот, который я использую:

<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">
0 голосов
/ 03 марта 2015

Это то, что я использую, чтобы получить теги из строк:

</? *img[^>]*>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...