示例#1
0
        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;
        }