正则表达式以匹配非HTML标签

时间:2018-08-31 19:24:00

标签: regex

这是我的RegEx,与所有HTMl标签匹配。 https://regex101.com/r/bDHD9z/3

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

我想创建相反的一个,它匹配HTML标记以外的所有内容。此正则表达式应与内部匹配并链接以下文本:

<span class="className" id='ID' name=name>inside</span>
<a href="" title="displays >">link</a>

我尝试使用负前瞻https://regex101.com/r/bDHD9z/4并没有达到我的预期。

某些人建议的HTML解析器是不可能的,因为我需要使用Regex匹配其他条件

2 个答案:

答案 0 :(得分:-1)

您在这里( 最快版本

([^<]*)(?:<(?:(?:(?:(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]*?))))>|<|$)+

OP示例:https://regex101.com/r/YxFqTZ/1

真实世界:https://regex101.com/r/jQDryu/1

您想要的每次都在第1组中。
单数匹配(其中html以标签开头)中,组1将为空。
单数匹配中,html以标记结尾,字符串的结尾将始终匹配,第1组将为空。

我建议让RegexFormat 8进行格式化
并保持这种表达。

然后可以将其格式化为代码,并附带注释。

 (                             # (1 start), Non-tag content
      [^<]*
 )                             # (1 end)
 (?:
      # Tag
      <
      (?:
           (?:
                # Invisible content, end tag req'd
                (?:
                     (                             # (2 start), Content tag
                          script
                       |  style
                       |  object
                       |  embed
                       |  applet
                       |  noframes
                       |  noscript
                       |  noembed
                     )                             # (2 end)
                     (?:
                          \s+
                          (?>
                               " [\S\s]*? "
                            |  ' [\S\s]*? '
                            |  (?:
                                    (?! /> )
                                    [^>]
                               )?
                          )+
                     )?
                     \s* >
                )
                [\S\s]*? </ \2 \s*            # Closing content tag
                (?= > )
           )
        |  (?: /? [\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]*? )
                )
           )
      )
      >
   |
      # or, <
      <
   |
      # or, EOS
      $
 )+

哪个基准

Regex1:   ([^<]*)(?:<(?:(?:(?:(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]*?))))>|<|$)+
Options:  < none >
Completed iterations:   50  /  50     ( x 1 )
Matches found per iteration:   2221
Elapsed Time:    0.82 s,   820.34 ms,   820341 µs
Matches per sec:   135,370

答案 1 :(得分:-1)

如果您不能使用HTML解析器,则可以尝试以下正则表达式:

(?:>)(?:\s*|([^><]+))(?:<)

https://regex101.com/r/fSbZe9/3