Tag Validator
Given a string representing a code snippet, implement a tag validator to parse the code and return whether it is valid.
A code snippet is valid if all the following rules hold:
- The code must be wrapped in a valid closed tag. Otherwise, the code is invalid.
- A closed tag (not necessarily valid) has exactly the following format:
<TAG_NAME>TAG_CONTENT</TAG_NAME>. Among them,<TAG_NAME>is the start tag, and</TAG_NAME>is the end tag. TheTAG_NAMEin start and end tags should be the same. A closed tag is valid if and only if theTAG_NAMEandTAG_CONTENTare valid. - A valid
TAG_NAMEonly contains upper-case letters, and has length in range[1, 9]. Otherwise, theTAG_NAMEis invalid. - A valid
TAG_CONTENTmay contain other valid closed tags, cdata, and any characters except unmatched<, unmatched start and end tag, and unmatched or closed tags with invalidTAG_NAME. Otherwise, theTAG_CONTENTis invalid. - A start tag is unmatched if no end tag exists with the same
TAG_NAME, and vice versa. However, you also need to consider the issue of unbalanced tags when tags are nested. - A
<is unmatched if you cannot find a subsequent>. When you find a<or</, all the subsequent characters until the next>should be parsed asTAG_NAME(not necessarily valid). - The cdata has the following format:
<![CDATA[CDATA_CONTENT]]>. The range ofCDATA_CONTENTis defined as the characters between<![CDATA[and the first subsequent]]>. CDATA_CONTENTmay contain any characters. The function of cdata is to forbid the validator to parseCDATA_CONTENT, so even if it has some characters that can be parsed as a tag, no matter valid or invalid, you should treat it as regular characters.
Return whether the given code is valid.
Example 1
Input
code = "<DIV>This is the first line <![CDATA[<div>]]></DIV>"Output
trueThe code is wrapped in a valid
<DIV> closed tag, and its content consists of regular characters and cdata that should be treated as plain text.Example 2
Input
code = "<DIV>>> ![cdata[]] <![CDATA[<div>]>]]>]]>>]</DIV>"Output
trueThe code separates into the start tag
<DIV>, valid tag content containing text and cdata ending at the first subsequent ]]>, and the matching end tag </DIV>.Constraints
- 1 <= code.length <= 500
- code consists of English letters, digits,
'<','>','/','!','[',']','.', and' '.