Ricerca di un tag html tramite regular expression con sostituzione tramite delegate in C#
Può capitare di avere un testo html da "normalizzare" ad esempio perché contiene tag mal formattati o url che vanno riadattate.
In questo caso può tornare utile questa funzione che, tramite le Regular Expression, cerca determinati tag html e li sostituisce con una versione modificata (tramite una funzione richiamata per ogni occorrenza trovata).
Nell'esempio cerco tutti i tag di tipo img e anchor e li sostituisco con una versione "semplificata":
in pratica vado a rimuovere dai tag img tutti gli attributi tranne src e dai tag anchor tutti gli attributi tranne href.
Ad esempio
diventa
Altro caso in cui tornano utili le Regular Expression è quando si devono eliminare dei tag, ad esempio il tag script:
ad esempio
diventa
In questo caso può tornare utile questa funzione che, tramite le Regular Expression, cerca determinati tag html e li sostituisce con una versione modificata (tramite una funzione richiamata per ogni occorrenza trovata).
Nell'esempio cerco tutti i tag di tipo img e anchor e li sostituisco con una versione "semplificata":
C#
using System.Text.RegularExpressions;
/// <summary>
/// ricerca di tag html tramite regular expression
/// e sostituzione tramite una funzione delegato
/// http://www.sgart.it
/// </summary>
/// <param name="html">il testo con i tag html</param>
/// <returns>il testo con i tag sostituiti</returns>
public static string ReplaceHtml(string html)
{
// uso gli explicit capture (?<nome>...)
RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.ExplicitCapture | RegexOptions.Compiled;
// espression per cercare i tag "img" e "a"
Regex reHtml = new Regex(@"\<(?<tag>(img|a)[^\>]*)\>", options);
// espression per cercare gli attributi "src" e "href" all'interno del tag
Regex reAttr = new Regex(@"\b(?<attr>(src|href))\b=[""'](?<url>[^""']*)", options);
// funzione di sostituzione tramite delegato, per ogni tag trovato viene richiamata la funzione delegato
return reHtml.Replace(html, delegate (Match mHtml)
{
// il tag trovato senza i simboli
string tag = mHtml.Groups["tag"].Value;
// salvo il tag originale
string result = result = mHtml.Value;
// verifica/trova se ha l'attributo src o href
Match mAttr = reAttr.Match(tag);
if (mAttr.Success)
{
string attr = mAttr.Groups["attr"].Value;
string url = mAttr.Groups["url"].Value;
if (attr.Equals("src", StringComparison.InvariantCultureIgnoreCase))
result = "<img src=\"" + url + "\" class=\"lazy\">"; // salvo il tag "img" modificato
else
if (!(url.StartsWith("javascript:", StringComparison.InvariantCultureIgnoreCase) || url.StartsWith("mailto:", StringComparison.InvariantCultureIgnoreCase)))
result = "<a href=\"" + url + "\" class=\"replaced\">"; // se non inizia con ... salvo il tag "a" modificato
}
// solo per debug
Console.WriteLine(tag + " \r\n -- > " + result);
return result; // ritorno il testo da sostituire all'originale
});
}
Ad esempio
HTML
<img src="/_layouts/images/fgimg.png" alt="Passa a livello superiore" style="border:0;position:absolute;left:-0px !important;top:-112px !important;" /></a></span></span><div class="ms-popoutMenu s4-breadcrumb-menu" id="GlobalBreadCrumbNavPopout-menu" style="display:none;">
<a id="ctl00_IdWelcome_ExplicitLogin" class="s4-signInLink" href="http://www.sgart.it/_layouts/Authenticate.aspx?Source=%2FPagine%2Fhome%2Easpx" style="display:inline;">
HTML
<img src="/_layouts/images/fgimg.png" class="lazy">
<a href="http://www.sgart.it/_layouts/Authenticate.aspx?Source=%2FPagine%2Fhome%2Easpx" class="replaced">
Altro caso in cui tornano utili le Regular Expression è quando si devono eliminare dei tag, ad esempio il tag script:
C#
/// <summary>
/// rimozione/disabilitazione dei tag "script"
/// http://www.sgart.it
/// </summary>
/// <param name="html">il testo con i tag html</param>
/// <returns>il testo con i tag sostituiti</returns>
private static string ReplaceHtmlScript(string html)
{
// non uso gli explicit capture
RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Compiled;
// espression per cercare i tag "script"
Regex reHtml = new Regex(@"<script[^>]*>([\s\S]*?)</script>", options);
return reHtml.Replace(html, delegate (Match mHtml)
{
// contenuto del tag script, quello all'interno delle parentesi tonde, l'indice 0 indica tutta quello trovato (compreso il tag script iniziale e finale)
string content = mHtml.Groups[1].Value;
// lascio lo script ma lo commento
return "<!-- script disabled \r\n" + content + " \r\n -->";
// return ""; // tolgo completamente lo script
});
}
HTML
<script type="text/javascript">
var _fV4UI = true;
</script>
HTML
<!-- script disabled
var _fV4UI = true;
-->