web-dev-qa-db-fra.com

Expression régulière pour obtenir le code SRC des images en C #

Je cherche une expression régulière pour isoler la valeur src d'un img. (Je sais que ce n’est pas la meilleure façon de faire mais c’est ce que je dois faire dans ce cas)

J'ai une chaîne qui contient du code html simple, du texte et une image. Je dois obtenir la valeur de l'attribut src à partir de cette chaîne. Je n'ai réussi qu'à isoler l'étiquette entière jusqu'à présent.

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

Je sais que vous dites que vous devez utiliser regex, mais si possible, je donnerais vraiment une chance à ce projet open source: HtmlAgilityPack

Il est vraiment facile à utiliser, je viens de le découvrir et cela m’a beaucoup aidé, car je faisais une analyse syntaxique plus lourde en html. Il vous permet essentiellement d’utiliser XPATHS pour obtenir vos éléments.

Leur exemple de page est un peu obsolète, mais l’API est très facile à comprendre, et si vous êtes un peu familier avec xpath, vous vous en rendrez compte maintenant.

Le code de votre requête ressemblerait à ceci: (code non compilé)

 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)
 }
12
Francisco Noriega

J'ai essayé ce que Francisco Noriega avait suggéré, mais il semble que l'api de HtmlAgilityPack ait été modifié. Voici comment je l'ai résolu:

        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);
        }
6
eflles

La regex que vous voulez devrait être dans les lignes de:

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

J'espère que cela t'aides.

2

Cela devrait capturer toutes les balises img et juste la partie src, peu importe où elle se trouve (avant ou après la classe, etc.) et prend en charge html/xhtml: D

<img.+?src="(.+?)".+?/?>
1
Fabian

vous pouvez également utiliser un regard en arrière pour le faire sans avoir besoin de sortir un groupe

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

n'oubliez pas d'échapper aux citations si nécessaire

1
Seattle Leonard

C'est ce que j'utilise pour extraire les balises des chaînes:

</? *img[^>]*>
0
TheTC

Voici celui que j'utilise:

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

La bonne partie est que cela correspond à l'un des éléments suivants:

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

Et il peut également correspondre à certains scénarios inattendus tels que des attributs supplémentaires, par exemple:

<img src = "test.jpg" width="300">
0
David Niki