[英]Regular expression for HTML tags
我正在研究詞法分析器。 我有一個HTML文件。 我想將文件中的每個字母轉換成HTML標簽中寫入的大寫字母。 例:
<html>
<body>
StackOverFlow
</body>
</html>
這將轉換為以下內容。
<html>
<body>
STACKOVERFLOW
</body>
</html>
我只想知道正則表達式將選擇HTML標記中的所有內容並對它們不執行任何操作。
僅考慮<
和>
簡單HTML標記。
使用以下任一正則表達式:
(?<=<)[^<]+(?=>)
說明: (?<=<)
- 檢查我們是否在[^<]+
之前有一個<
(不要消耗)(1個或多個非開括號)(消耗),然后檢查我們是否有>
(?=>)
(不要消費)。 由於我們僅使用中間部分,因此我們使用p
代替<p>
作為匹配。
或者,只是為了將括號與標簽匹配:
<[^<]+>
說明: <
匹配單個文字<
,然后[^<]+
匹配除<
和然后單個文字>
之外的1個或多個字符。 消耗掉所有字符,因此匹配將類似於<p>
。
根據輸入/用戶受眾的來源,您可能需要提高容差。 雖然我討厭沒有引號的標簽屬性,但你會遇到這種情況。 您還會在標簽中遇到惰性括號,例如value="4 > 3"
。
(?<=<)([\w-]+)((?:\s+[\w-]+\s*(?:=\s*(?:[^"'>\s]+|("|').*?\3))?)*)\s*(?=>)
要么
<([\w-]+)((?:\s+[\w-]+\s*(?:=\s*(?:[^"'>\s]+|("|').*?\3))?)*)\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
\3 # 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 \003.
) # Closes NCG
)? # Closes NCG
# ? repeats zero or one times
)* # Closes NCG
) # Closes CG2
\s* # Token: \s (white space)
(?= # Opens LA
> # Literal >
) # Closes LA
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.