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
我正在研究词法分析器。我有一个 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