private static void ValidNestedRule(HtmlTag tag, HtmlNestedRule nestRule, List <HtmlTag[]> invalidNestedTags, List <HtmlTag> startTags) { if (startTags.Count > 0) { string lastTagName = startTags[startTags.Count - 1].TagName.Trim('/'); string tagName = tag.TagName.Trim('/'); if (nestRule.IsNestValid(lastTagName, tagName) == false) { invalidNestedTags.Add(new[] { startTags[startTags.Count - 1], tag }); } } }
public static bool ValidateHtmlTag(string html, bool fullValidate, out string message) { message = string.Empty; if (string.IsNullOrEmpty(html)) return true; MatchCollection matchs = HtmlTagReg.Matches(html); if (matchs.Count == 0) return true; HtmlNestedRule nestRule = new HtmlNestedRule(); List<HtmlTag> startTags = new List<HtmlTag>(); List<HtmlTag> missingEndTags = new List<HtmlTag>(); List<HtmlTag> missingStartTags = new List<HtmlTag>(); List<HtmlTag> redundantSpaceTags = new List<HtmlTag>(); List<HtmlTag[]> invalidNestedTags = new List<HtmlTag[]>(); List<HtmlTag> notAllowTags = new List<HtmlTag>(); Func<int> totalErrorTag = () => { return missingEndTags.Count + missingStartTags.Count + redundantSpaceTags.Count + invalidNestedTags.Count + notAllowTags.Count; }; int elementsCount = 0; foreach (Match match in matchs) { if (!match.Success) continue; HtmlTag tag = new HtmlTag(match.Groups[0].Value, match.Groups[1].Value, match.Groups[2].Value.Replace(" ", ""), match.Groups[3].Value.Replace(" ", ""), ++elementsCount); if (tag.IsRedundantSpace) { redundantSpaceTags.Add(tag); } if (tag.IsSelfClose) continue; if (tag.IsEndTag) { int lastMatchEndTagIndex = MatchTagPair(tag, startTags); if (lastMatchEndTagIndex >= 0) { AddMissingEndTag(missingEndTags, startTags, lastMatchEndTagIndex); } else { missingStartTags.Add(tag); } } else { ValidNotAllowTag(tag, notAllowTags); ValidNestedRule(tag, nestRule, invalidNestedTags, startTags); startTags.Add(tag); } if (!fullValidate && totalErrorTag() > 0) { break; } } missingEndTags.AddRange(startTags); message = BuildMessage(redundantSpaceTags, missingStartTags, missingEndTags, invalidNestedTags, notAllowTags); return totalErrorTag() == 0; }
public static bool ValidateHtmlTag(string html, bool fullValidate, out string message) { message = string.Empty; if (string.IsNullOrEmpty(html)) { return(true); } MatchCollection matchs = HtmlTagReg.Matches(html); if (matchs.Count == 0) { return(true); } HtmlNestedRule nestRule = new HtmlNestedRule(); List <HtmlTag> startTags = new List <HtmlTag>(); List <HtmlTag> missingEndTags = new List <HtmlTag>(); List <HtmlTag> missingStartTags = new List <HtmlTag>(); List <HtmlTag> redundantSpaceTags = new List <HtmlTag>(); List <HtmlTag[]> invalidNestedTags = new List <HtmlTag[]>(); List <HtmlTag> notAllowTags = new List <HtmlTag>(); Func <int> totalErrorTag = () => { return(missingEndTags.Count + missingStartTags.Count + redundantSpaceTags.Count + invalidNestedTags.Count + notAllowTags.Count); }; int elementsCount = 0; foreach (Match match in matchs) { if (!match.Success) { continue; } HtmlTag tag = new HtmlTag(match.Groups[0].Value, match.Groups[1].Value, match.Groups[2].Value.Replace(" ", ""), match.Groups[3].Value.Replace(" ", ""), ++elementsCount); if (tag.IsRedundantSpace) { redundantSpaceTags.Add(tag); } if (tag.IsSelfClose) { continue; } if (tag.IsEndTag) { int lastMatchEndTagIndex = MatchTagPair(tag, startTags); if (lastMatchEndTagIndex >= 0) { AddMissingEndTag(missingEndTags, startTags, lastMatchEndTagIndex); } else { missingStartTags.Add(tag); } } else { ValidNotAllowTag(tag, notAllowTags); ValidNestedRule(tag, nestRule, invalidNestedTags, startTags); startTags.Add(tag); } if (!fullValidate && totalErrorTag() > 0) { break; } } missingEndTags.AddRange(startTags); message = BuildMessage(redundantSpaceTags, missingStartTags, missingEndTags, invalidNestedTags, notAllowTags); return(totalErrorTag() == 0); }
private static void ValidNestedRule(HtmlTag tag, HtmlNestedRule nestRule, List<HtmlTag[]> invalidNestedTags, List<HtmlTag> startTags) { if (startTags.Count > 0) { string lastTagName = startTags[startTags.Count - 1].TagName.Trim('/'); string tagName = tag.TagName.Trim('/'); if (nestRule.IsNestValid(lastTagName, tagName) == false) { invalidNestedTags.Add(new[] { startTags[startTags.Count - 1], tag }); } } }