演示只是一個供參考,至於標籤去,這是不可忽視的一個標籤
沒有解析所有標籤。
您可以跳過/失敗過去的html標籤和隱形內容。
這會找到你要找的單詞。
'~<(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\s+(?>"[\S\s]*?"|\'[\S\s]*?\'|(?:(?!/>)[^>])?)+)?\s*>)[\S\s]*?</\1\s*(?=>))|(?:/?[\w:]+\s*/?)|(?:[\w:]+\s+(?:"[\S\s]*?"|\'[\S\s]*?\'|[^>]?)+\s*/?)|\?[\S\s]*?\?|(?:!(?:(?:DOCTYPE[\S\s]*?)|(?:\[CDATA\[[\S\s]*?\]\])|(?:--[\S\s]*?--)|(?:ATTLIST[\S\s]*?)|(?:ENTITY[\S\s]*?)|(?:ELEMENT[\S\s]*?))))>(*SKIP)(?!)|(?:text|simple)~'
https://regex101.com/r/7ZGlvW/1
格式化
<
(?:
(?:
(?:
# Invisible content; end tag req'd
( # (1 start)
script
| style
| object
| embed
| applet
| noframes
| noscript
| noembed
) # (1 end)
(?:
\s+
(?>
" [\S\s]*? "
| ' [\S\s]*? '
| (?:
(?! />)
[^>]
)?
)+
)?
\s* >
)
[\S\s]*? </ \1 \s*
(?= >)
)
| (?: /? [\w:]+ \s* /?)
| (?:
[\w:]+
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
\s* /?
)
| \? [\S\s]*? \?
| (?:
!
(?:
(?: DOCTYPE [\S\s]*?)
| (?: \[CDATA\[ [\S\s]*? \]\])
| (?: -- [\S\s]*? --)
| (?: ATTLIST [\S\s]*?)
| (?: ENTITY [\S\s]*?)
| (?: ELEMENT [\S\s]*?)
)
)
)
>
(*SKIP)
(?!)
|
(?: text | simple)
或者,更快的方法是符合這兩個標籤和文本你
尋找。
將標籤匹配移過它們。
如果您正在進行替換,請使用回調來確定要替換的內容。
組1是TAG或隱形內容運行。
第3組是你正在取代的詞。
因此,在回調中,如果組1匹配,只需返回組1.如果組3匹配,則替換爲您想要替換的組。
正則表達式
'~(<(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\s+(?>"[\S\s]*?"|\'[\S\s]*?\'|(?:(?!/>)[^>])?)+)?\s*>)[\S\s]*?</\2\s*(?=>))|(?:/?[\w:]+\s*/?)|(?:[\w:]+\s+(?:"[\S\s]*?"|\'[\S\s]*?\'|[^>]?)+\s*/?)|\?[\S\s]*?\?|(?:!(?:(?:DOCTYPE[\S\s]*?)|(?:\[CDATA\[[\S\s]*?\]\])|(?:--[\S\s]*?--)|(?:ATTLIST[\S\s]*?)|(?:ENTITY[\S\s]*?)|(?:ELEMENT[\S\s]*?))))>)|(text|simple)~'
https://regex101.com/r/7ZGlvW/2
這正則表達式是媲美SAX和DOM解析器解析如何標記。
我已經在SO上發佈了數百次。
下面是如何刪除所有的HTML標籤的例子:
https://regex101.com/r/oCVkZv/1
來源
2017-08-27 00:26:57
sln
你絕對需要匹配,或捕獲組會做什麼? – Vivick
如果您想自信地解析html,請使用不是正則表達式的html解析器。所以反覆說這一遍又一遍。 IIRC甚至有一個說明,即SO軟件彈出說「不要使用正則表達式來解析html」。 – mickmackusa
@mickmackusa,但是當你使用解析器時,他們停止工作,解析格式錯誤的html。 我覺得這個問題不是重複的。因爲我沒有試圖剝離標籤,我試圖替換標籤「腳本」之外的內容。 –