Pregunta

Estoy buscando una expresión regular para aislar el valor src de una img. (Sé que esto no es la mejor manera de hacer esto, pero esto es lo que tengo que hacer en este caso)

Tengo una cadena que contiene código HTML simple, un texto y una imagen. Necesito obtener el valor del atributo src de esa cadena. He conseguido solamente para aislar toda la etiqueta hasta ahora.

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

Solución

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

Otros consejos

Sé que decir tiene que usar expresiones regulares, pero si es posible me gustaría realmente dar a este proyecto de código abierto una oportunidad: HtmlAgilityPack

Es muy fácil de usar, acabo de descubrir y me ha ayudado mucho, ya que yo estaba haciendo un análisis de HTML más pesado. Básicamente le permite utilizar XPaths para obtener sus elementos.

Su página de ejemplo es un poco anticuado, pero la API es muy fácil de entender, y si usted es un poco familiarizado con XPaths obtendrá cabeza alrededor de ella en el ahora

El código para su búsqueda sería algo como esto: (código sin compilar)

 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)
 }

He intentado lo que sugiere Francisco Noriega, pero parece que la API a la HtmlAgilityPack ha sido alterado. Aquí es cómo lo resolví:

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

La expresión regular que desea debe ser a lo largo de las líneas de:

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

Espero que esto ayude.

Esto debe capturar todas las etiquetas img y sólo la parte src sin importar dónde se encuentra ubicado (antes o después de clase, etc.) y compatible con HTML / XHTML: D

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

También puede utilizar un vistazo detrás de hacerlo sin necesidad de sacar un grupo

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

recuerde que debe escapar de las comillas si es necesario

Esto es lo que uso para obtener las etiquetas de cadenas:

</? *img[^>]*>

Aquí está el uso de una sola I:

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

La parte buena es que coincide con cualquiera de los siguientes:

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

Y también puede coincidir con algunos escenarios inesperados como atributos adicionales, por ejemplo:

<img src = "test.jpg" width="300">
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top