public override Tag Init(string text) { if (text.EndsWith("/>")) { mode = OpeningClosingMode.SelfClosed; } else if (text.StartsWith("</")) { mode = OpeningClosingMode.Closing; } else { mode = OpeningClosingMode.Opening; } htmlTag = Regex.Match(text, "</?([a-z0-9]+)[ />]", RegexOptions.IgnoreCase).Groups[1].Value; if (mode == OpeningClosingMode.Closing) { Text = $"</{htmlTag}>"; return(this); } if (mode == OpeningClosingMode.Opening) { text = $"{text}</{htmlTag}>"; // close tag for xelement parsing } var parsed = XElement.Parse(text); var validAttrs = validTags[htmlTag]; // remove invalid attributes foreach (var attr in parsed.Attributes().ToList()) { var name = attr.Name.ToString(); if (!validAttrs.Contains(name)) { parsed.SetAttributeValue(attr.Name, null); } if ((name == "src" || name == "href") && !attr.Value.IsValidLinkOrRelativeUrl(name == "src")) { parsed.SetAttributeValue(attr.Name, null); } } text = parsed.ToString(); // turn back to string if (mode == OpeningClosingMode.Opening) { text = text.Substring(0, text.Length - 3 - htmlTag.Length); } Text = text; return(this); }
public override Tag Init(string text) { if (text.EndsWith("/>")) mode = OpeningClosingMode.SelfClosed; else if (text.StartsWith("</")) mode = OpeningClosingMode.Closing; else mode = OpeningClosingMode.Opening; htmlTag = Regex.Match(text, "</?([a-z0-9]+)[ />]", RegexOptions.IgnoreCase).Groups[1].Value; if (mode == OpeningClosingMode.Closing) { Text = $"</{htmlTag}>"; return this; } if (mode == OpeningClosingMode.Opening) text = $"{text}</{htmlTag}>"; // close tag for xelement parsing var parsed = XElement.Parse(text); var validAttrs = validTags[htmlTag]; // remove invalid attributes foreach (var attr in parsed.Attributes().ToList()) { var name = attr.Name.ToString(); if (!validAttrs.Contains(name)) parsed.SetAttributeValue(attr.Name, null); if ((name == "src" || name == "href") && !attr.Value.IsValidLinkOrRelativeUrl()) parsed.SetAttributeValue(attr.Name, null); } text = parsed.ToString(); // turn back to string if (mode == OpeningClosingMode.Opening) text = text.Substring(0, text.Length - 3 - htmlTag.Length); Text = text; return this; }