HTML 标签的正则表达式

Regular expression for HTML tags

我正在研究词法分析器。我有一个 HTML 文件。我想将文件中的每个字母(除了 HTML 标记中的任何内容)都转换为大写字母。示例:

<html>
    <body>
       Whosebug
    </body>
</html>

这将转换为以下内容。

<html>
    <body>
       Whosebug
    </body>
</html>

我只想知道 select HTML 标签内的所有内容而不对它们做任何事情的正则表达式。

仅考虑 <> 内的简单 HTML 标签。

使用以下任一正则表达式:

(?<=<)[^<]+(?=>)

解释: (?<=<) - 检查在[^<]+(1个或更多非-左括号)(消耗),然后用 (?=>) 检查它后面是否有 >(不消耗)。因为我们只消耗中间部分,所以我们有 p 而不是 <p> 作为匹配项。

或者,只是将括号与标签匹配:

<[^<]+>

解释: < 匹配单个文字 <,然后 [^<]+ 匹配除 < 之外的 1 个或多个字符然后是一个文字 >。所有字符都被消耗掉,因此匹配看起来像 <p>.

根据 input/audience 用户的来源,您可能需要提高容忍度。虽然我讨厌没有引号的标记属性,但您确实遇到过这种情况。您还会在标签中遇到惰性括号,例如 value="4 > 3".

(?<=<)([\w-]+)((?:\s+[\w-]+\s*(?:=\s*(?:[^"'>\s]+|("|').*?))?)*)\s*(?=>)

<([\w-]+)((?:\s+[\w-]+\s*(?:=\s*(?:[^"'>\s]+|("|').*?))?)*)\s*>

第一个正则表达式的解释(第二个正则表达式类似,但实际上捕获括号而不是通过环视观察它们)。

 (?<=                              # Opens LB
     <                             # Literal <
 )                                 # Closes LB
 (                                 # Opens CG1
     [\w-]+                        # Character class (any of the characters within)
                                     # Token: \w (a-z, A-Z, 0-9, _)
                                     # Any of: -
                                     # + repeats one or more times
 )                                 # Closes CG1
 (                                 # Opens CG2
     (?:                           # Opens NCG
         \s+                       # Token: \s (white space)
         [\w-]+                    # Character class (any of the characters within)
                                     # Token: \w (a-z, A-Z, 0-9, _)
                                     # Any of: -
         \s*                       # Token: \s (white space)
                                     # * repeats zero or more times
         (?:                       # Opens NCG
             =                     # Literal =
             \s*                   # Token: \s (white space)
             (?:                   # Opens NCG
                 [^"'>\s]+         # Negated Character class (excludes the characters within)
                                     # None of: "'>
                                     # Token: \s (white space)
             |                     # Alternation (NCG)
                 (                 # Opens CG3
                     "             # Literal "
                 |                 # Alternation (CG3)
                     '             # Literal '
                 )                 # Closes CG3
                 .*?               # . denotes any single character, except for newline
                                     # * repeats zero or more times
                                     # ? as few times as possible
                                 # A backreference to CG3
                                     # This is not a repeat of the match, not the pattern.
                                     # If this is an Octal Escape try padding with 0s like [=12=]3.
             )                     # Closes NCG
         )?                        # Closes NCG
                                     # ? repeats zero or one times
     )*                            # Closes NCG
 )                                 # Closes CG2
 \s*                               # Token: \s (white space)
 (?=                               # Opens LA
     >                             # Literal >
 )                                 # Closes LA