C # + HTMLAgilityPack: retrive la valeur de l'URL de fond

c# css html-agility-pack

Question

Je vais extraire l'arrière-plan de certains fichiers HTML et les remplacer par de nouvelles valeurs.
Afin de contrôler si la balise BODY a un fond défini dans son style, css, je l’utilise en dessous du code:

foreach (HtmlNode bodyNode in doc.DocumentNode.SelectNodes("//body"))
{
  if (bodyNode.Attributes.Contains("style") && bodyNode.Attributes["style"].Value.Replace(" ","").Contains("background-image:url"))
  {
    //code to replace background-url
  }

}

mon problème est de savoir comment récupérer la valeur background-url d'une telle balise à partir de propriétés de style:

foreach (HtmlNode bodyNode in doc.DocumentNode.SelectNodes("//body"))
{
  if (bodyNode.Attributes.Contains("style") && bodyNode.Attributes["style"].Value.Replace(" ","").Contains("background-image:url"))
  {
    //code to replace background-url
  }

}

et remplacez-le par une nouvelle valeur comme ci-dessous:

foreach (HtmlNode bodyNode in doc.DocumentNode.SelectNodes("//body"))
{
  if (bodyNode.Attributes.Contains("style") && bodyNode.Attributes["style"].Value.Replace(" ","").Contains("background-image:url"))
  {
    //code to replace background-url
  }

}

Réponse acceptée

Essayez le code ci-dessous. Extrayez l'url de l'image d'arrière-plan (chaîne entre crochets) avec l'expression rationnelle et remplacez-le par la nouvelle image. Maintenant, supprimez l'attribut de style et ajoutez-en un nouveau (style avec l'image remplacée).

Cela fonctionnera avec toutes les valeurs et tous les formats de propriétés.

           foreach (HtmlNode bodyNode in doc.DocumentNode.SelectNodes("//body"))
            {
                string newImg = "new-value.png";
                if (bodyNode.Attributes.Contains("style") && bodyNode.Attributes["style"].Value.Contains("background-image:url"))
                {                     
                    string style = bodyNode.Attributes["style"].Value;
                    string oldImg = Regex.Match(style, @"(?<=\().+?(?=\))").Value;
                    string oldStyle = bodyNode.Attributes["style"].Value;
                    string newStyle = oldStyle.Replace(oldImg, newImg);

                    bodyNode.Attributes.Remove("style");
                    bodyNode.Attributes.Add("style", newStyle);
                }

            }

Réponse populaire

vous pouvez supprimer l'ancien style et ajouter le nouveau style, par exemple:

bodyNode.Attributes.Remove("style");
bodyNode.Attributes.Add("style", "width:95%;background-image: url('test/bg1.jpg');font-size:xx-large;text-align:center");



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi