演示只是一个供参考,至于标签去,这是不可忽视的一个标签
没有解析所有标签。
您可以跳过/失败过去的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。 我觉得这个问题不是重复的。因为我没有试图剥离标签,我试图替换标签“脚本”之外的内容。 –