HTML5で省略できるタグにマッチする正規表現


## 注意

* 一部のパターンは**未完成です**。

* 本投稿には原文の引用を載せていますが、著者は英訳が出来ません。翻訳ミスの指摘などは、[翻訳元の投稿](http://qiita.com/labocho/items/54fd70c73ced35c8ba49)にお願いします。

* 本投稿の正規表現をPHPで利用する場合、UTF-8の文字列に対して使う場合にはu(PCRE_UTF8)オプションを指定してください。
指定しない場合、[文字列が破壊される恐れがあります](http://qiita.com/masakielastic/items/c44058dd42cece783c4f)。

## 参考

* [HTML5 で省略できるタグ - Qiita](http://qiita.com/labocho/items/54fd70c73ced35c8ba49)
* [12.1.2.4 Optional tags] - [HTML Standard](https://html.spec.whatwg.org/multipage/syntax.html)
* [正規表現 - 文字列内から HTML タグを正確に判別！ - mk-mode BLOG](http://www.mk-mode.com/octopress/2013/02/13/regexp-html-tag/)
* [htmlのコメントタグを除去するJavaScriptの正規表現。 - freefielder.jp](http://freefielder.jp/blog/2012/09/html-cmt-tag-remove-js.html)
* [4.3. Elements](http://www.w3.org/TR/html-markup/syntax.html#syntax-elements) - [HTML syntax - HTML5](http://www.w3.org/TR/html-markup/syntax.html)

## 前提

* 以下の正規表現は、正当なHTMLで動作させることを想定しています。
要素ではない`<`や`>`などの文字は、`&lt;`や`&gt;`に置換されている必要があります。

* この正規表現では肯定的前方先読み`(?=pattern)`と否定的前方先読み`(?!pattern)`のパターンを利用しています。
また、厳密版のパターンでは、制御文字の指定のためバイトコード表現`\xhh`(`h`は16進表現の文字)を利用しています。

* PHPの[preg_match_all関数](http://php.net/manual/ja/function.preg-match-all.php)で検証を行っていますが、ミスが存在するかもしれません。利用する場合、予め検証を行って下さい。またミスが見つかった場合、指摘していただければありがたいです。

### HTMLの正規表現

#### 簡易版

```txt:要素の開始タグにマッチする正規表現(属性込み)(閉じタグの無い要素を含む)
<[0-9a-zA-Z]+(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*/?>
```

```txt:要素の閉じタグにマッチする正規表現
</[0-9a-zA-Z]+\s*>
```

```txt:コメントにマッチする正規表現
<!--[\s\S]*?-->
```

```txt:空白文字にマッチする正規表現
\s
```

```txt:x要素の開始タグにマッチする正規表現(属性込み)(閉じタグの無い要素を含む)
<x(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*/?>
```

```txt:x要素の閉じタグにマッチする正規表現
</x\s*>
```

#### 厳密版

```txt:要素の開始タグにマッチする正規表現(属性込み)(閉じタグの無い要素を含む)
<[0-9a-zA-Z]+([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*/?>
```

```txt:要素の閉じタグにマッチする正規表現
</[0-9a-zA-Z]+[ \t\n\f\r]*>
```

```txt:コメントにマッチする正規表現
<!--[\s\S]*?-->
```

```txt:空白文字にマッチする正規表現
[ \t\n\f\r]
```

```txt:x要素の開始タグにマッチする正規表現(属性込み)(閉じタグの無い要素を含む)
<x([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*/?>
```

```txt:x要素の閉じタグにマッチする正規表現
</x[ \t\n\f\r]*>
```

<!--
```txt:要素名にマッチする正規表現
[0-9a-zA-Z]+
```

```txt:属性にマッチする正規表現
[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?
```

```txt:属性名にマッチする正規表現
[^ \x00-\x1F\x7F"'>/=]+
```

```txt:属性値にマッチする正規表現
[^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"
```
-->

##### 注意

* 制御文字の指定のため、バイトコード表現の`[\x00-\x1F\x7F]`を利用しています。このため、環境によっては正常に動作しない可能性があります。
* 仕様では、属性値などにUnicodeにない文字は利用できませんが、本投稿の正規表現では考慮していません。~~Unicodeにない文字の正規表現なんてどう書けばいいのよ…?~~

#### 参考

* [正規表現 - 文字列内から HTML タグを正確に判別！ - mk-mode BLOG](http://www.mk-mode.com/octopress/2013/02/13/regexp-html-tag/)
* [htmlのコメントタグを除去するJavaScriptの正規表現。 - freefielder.jp](http://freefielder.jp/blog/2012/09/html-cmt-tag-remove-js.html)
* [4.3. Elements](http://www.w3.org/TR/html-markup/syntax.html#syntax-elements) - [HTML syntax - HTML5](http://www.w3.org/TR/html-markup/syntax.html)

## 正規表現

### `<html>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">An <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-html-element">html</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-start-tag">start tag</a> may be omitted if the first thing inside the <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-html-element">html</a></code> element is not a <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-comments">comment</a>.</blockquote>

> `<html>` はその最初の内容がコメントでなければ省略できる

```txt:簡易版
<html\s*>(?!<!--[\s\S]*?-->)
```

```txt:厳密版
<html[ \t\n\f\r]*>(?!<!--[\s\S]*?-->)
```

### `</html>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">An <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-html-element">html</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-html-element">html</a></code> element is not immediately followed by a <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-comments">comment</a>.</blockquote>

> `</html>` は直後にコメントが続かなければ省略できる

```txt:簡易版
</html\s*>(?!<!--[\s\S]*?-->)
```

```txt:厳密版
</html[ \t\n\f\r]*>(?!<!--[\s\S]*?-->)
```

### `<head>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-head-element">head</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-start-tag">start tag</a> may be omitted if the element is empty, or if the first thing inside the <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-head-element">head</a></code> element is an element.</blockquote>

> `<head>` は内容が空か、最初の内容が要素なら省略できる

```txt:簡易版
<head\s*>(?=</head\s*>|<[0-9a-zA-Z]+(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*/?>)
```

```txt:厳密版
<head[ \t\n\f\r]*>(?=</head[ \t\n\f\r]*>|<[0-9a-zA-Z]+([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*/?>)
```

### `</head>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-head-element">head</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-head-element">head</a></code> element is not immediately followed by a <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#space-character">space character</a> or a <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-comments">comment</a>.</blockquote>

> `</head>` は直後に空白文字かコメントがなければ省略できる

```txt:簡易版
</head\s*>(?!\s|<!--[\s\S]*?-->)
```

```txt:厳密版
</head[ \t\n\f\r]*>(?![ \t\n\f\r]|<!--[\s\S]*?-->)
```

### `<body>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-body-element">body</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-start-tag">start tag</a> may be omitted if the element is empty, or if the first thing inside the <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-body-element">body</a></code> element is not a <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#space-character">space character</a> or a <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-comments">comment</a>, except if the first thing inside the <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-body-element">body</a></code> element is a <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-meta-element">meta</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-link-element">link</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/scripting.html#the-script-element">script</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-style-element">style</a></code>, or <code><a href="https://html.spec.whatwg.org/multipage/scripting.html#the-template-element">template</a></code> element. </blockquote>

> `<body>` は内容が空か、最初の内容が空白文字かコメントでなければ省略できるが、最初の要素が meta, link, script, style, template なら省略できない

```txt:簡易版
<body\s*>(?=</body\s*>|(?!\s|<!--[\s\S]*?-->|<(script|style|template)(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*>|<(meta|link)(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*/?>))
```

```txt:厳密版
<body[ \t\n\f\r]*>(?=</body[ \t\n\f\r]*>|(?![ \t\n\f\r]|<!--[\s\S]*?-->|<(script|style|template)([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*>|<(meta|link)([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*/?>))
```

### `</body>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-body-element">body</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-body-element">body</a></code> element is not immediately followed by a <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-comments">comment</a>.</blockquote>

> `</body>` は直後にコメントが続かなければ省略できる

```txt:簡易版
</body\s*>(?!<!--[\s\S]*?-->)
```

```txt:厳密版
</body[ \t\n\f\r]*>(?!<!--[\s\S]*?-->)
```

### `</li>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">An <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-li-element">li</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-li-element">li</a></code> element is immediately followed by another <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-li-element">li</a></code> element or if there is no more content in the parent element.</blockquote>

> `</li>` は直後に li 要素が続くか、親要素にそれ以上内容がなければ省略できる

```txt:簡易版
</li\s*>(?=<li(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*>|</[0-9a-zA-Z]+\s*>)
```

```txt:厳密版
</li[ \t\n\f\r]*>(?=<li([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*>|</[0-9a-zA-Z]+[ \t\n\f\r]*>)
```

### `</dt>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-dt-element">dt</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-dt-element">dt</a></code> element is immediately followed by another <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-dt-element">dt</a></code> element or a <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-dd-element">dd</a></code> element.</blockquote>

> `</dt>` は直後に dt, dd 要素が続けば省略できる

```txt:簡易版
</dt\s*>(?=<(dt|dd)(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*>)
```

```txt:厳密版
</dt[ \t\n\f\r]*>(?=<(dt|dd)([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*>)
```

### `</dd>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-dd-element">dd</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-dd-element">dd</a></code> element is immediately followed by another <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-dd-element">dd</a></code> element or a <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-dt-element">dt</a></code> element, or if there is no more content in the parent element.</blockquote>

> `</dd>` は直後に dt, dd 要素が続くか、親要素にそれ以上内容がなければ省略できる

```txt:簡易版
</dd\s*>(?=<(dt|dd)(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*>|</[0-9a-zA-Z]+\s*>)
```

```txt:厳密版
</dd[ \t\n\f\r]*>(?=<(dt|dd)([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*>|</[0-9a-zA-Z]+[ \t\n\f\r]*>)
```

### `</p>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-p-element">p</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-p-element">p</a></code> element is immediately followed by an <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-address-element">address</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-article-element">article</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-aside-element">aside</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-blockquote-element">blockquote</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/forms.html#the-details-element">details</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-div-element">div</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-dl-element">dl</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/forms.html#the-fieldset-element">fieldset</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-figcaption-element">figcaption</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-figure-element">figure</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-footer-element">footer</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/forms.html#the-form-element">form</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements">h1</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements">h2</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements">h3</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements">h4</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements">h5</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-h1,-h2,-h3,-h4,-h5,-and-h6-elements">h6</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-header-element">header</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-hgroup-element">hgroup</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-hr-element">hr</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-main-element">main</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/forms.html#the-menu-element">menu</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-nav-element">nav</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-ol-element">ol</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-p-element">p</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-pre-element">pre</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-section-element">section</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-table-element">table</a></code>, or <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-ul-element">ul</a></code> element, or if there is no more content in the parent element and the parent element is an <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#html-elements">HTML element</a> that is not an <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-a-element">a</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-audio-element">audio</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-del-element">del</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-ins-element">ins</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-map-element">map</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/scripting.html#the-noscript-element">noscript</a></code>, or <code><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-video-element">video</a></code> element.</blockquote>

> `</p>` は直後に address, article, aside, blockquote, details, div, dl, fieldset, figcaption, figure, footer, form, h1, h2, h3, h4, h5, h6, header, hgroup, hr, main, menu, nav, ol, p, pre, section, table, ul 要素が続くか、親要素が a, audio, del, ins, map, noscript, video 以外で親要素にそれ以上内容がなければ省略できる

```txt:簡易版
</p\s*>(?=<(address|article|aside|blockquote|details|div|dl|fieldset|figcaption|figure|footer|form|h1|h2|h3|h4|h5|h6|header|hgroup|main|menu|nav|ol|p|pre|section|table|ul)(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*>|<hr(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*/?>|</(?!(a|audio|del|ins|map|noscript|video)\s*>)[0-9a-zA-Z]+\s*>)
```

```txt:厳密版
</p[ \t\n\f\r]*>(?=<(address|article|aside|blockquote|details|div|dl|fieldset|figcaption|figure|footer|form|h1|h2|h3|h4|h5|h6|header|hgroup|main|menu|nav|ol|p|pre|section|table|ul)([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*>|<hr([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*/?>|</(?!(a|audio|del|ins|map|noscript|video)[ \t\n\f\r]*>)[0-9a-zA-Z]+[ \t\n\f\r]*>)
```

### `</rt>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">An <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-rt-element">rt</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-rt-element">rt</a></code> element is immediately followed by an <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-rt-element">rt</a></code> or <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-rp-element">rp</a></code> element, or if there is no more content in the parent element.</blockquote>

> `</rt>` は直後に rt, rp 要素が続くか、親要素にそれ以上内容がなければ省略できる

```txt:簡易版
</rt\s*>(?=<(rt|rp)(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*>|</[0-9a-zA-Z]+\s*>)
```

```txt:厳密版
</rt[ \t\n\f\r]*>(?=<(rt|rp)([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*>|</[0-9a-zA-Z]+[ \t\n\f\r]*>)
```

### `</rp>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">An <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-rp-element">rp</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-rp-element">rp</a></code> element is immediately followed by an <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-rt-element">rt</a></code> or <code><a href="https://html.spec.whatwg.org/multipage/semantics.html#the-rp-element">rp</a></code> element, or if there is no more content in the parent element.</blockquote>

> `</rp>` は直後に rt, rp 要素が続くか、親要素にそれ以上内容がなければ省略できる

```txt:簡易版
</rp\s*>(?=<(rt|rp)(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*>|</[0-9a-zA-Z]+\s*>)
```

```txt:厳密版
</rp[ \t\n\f\r]*>(?=<(rt|rp)([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*>|</[0-9a-zA-Z]+[ \t\n\f\r]*>)
```

### `</optgroup>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">An <code><a href="https://html.spec.whatwg.org/multipage/forms.html#the-optgroup-element">optgroup</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/forms.html#the-optgroup-element">optgroup</a></code> element  is immediately followed by another <code><a href="https://html.spec.whatwg.org/multipage/forms.html#the-optgroup-element">optgroup</a></code> element, or if  there is no more content in the parent element.</blockquote>

> `</optgroup>` は直後に別の optgroup 要素が続くか、親要素にそれ以上内容がなければ省略できる

```txt:簡易版
</optgroup\s*>(?=<optgroup(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*>|</[0-9a-zA-Z]+\s*>)
```

```txt:厳密版
</optgroup[ \t\n\f\r]*>(?=<optgroup([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*>|</[0-9a-zA-Z]+[ \t\n\f\r]*>)
```

### `</option>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">An <code><a href="https://html.spec.whatwg.org/multipage/forms.html#the-option-element">option</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/forms.html#the-option-element">option</a></code> element is immediately followed by another <code><a href="https://html.spec.whatwg.org/multipage/forms.html#the-option-element">option</a></code> element, or if it is immediately followed by an <code><a href="https://html.spec.whatwg.org/multipage/forms.html#the-optgroup-element">optgroup</a></code> element, or if there is no more content in the parent element.</blockquote>

> `</option>` は直後に option, optgroup 要素が続くか、親要素にそれ以上内容がなければ省略できる

```txt:簡易版
</option\s*>(?=<(option|optgroup)(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*>|</[0-9a-zA-Z]+\s*>)
```

```txt:厳密版
</option[ \t\n\f\r]*>(?=<(option|optgroup)([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*>|</[0-9a-zA-Z]+[ \t\n\f\r]*>)
```

### `<colgroup>`

**未完成**

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-colgroup-element">colgroup</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-start-tag">start tag</a> may be omitted if the first thing inside the <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-colgroup-element">colgroup</a></code> element is a <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-col-element">col</a></code> element, and if the element is not immediately preceded by another <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-colgroup-element">colgroup</a></code> element whose <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> has been omitted. (It can't be omitted if the element is empty.)</blockquote>

> `<colgroup>` はその最初の内容が col 要素で、直前に終了タグを省略した colgroup 要素がなければ省略できる (ただし空要素の場合省略できない)

```txt:最初の内容がcol要素の`&lt;colgroup&gt;`(簡易版)
<colgroup\s*>(?=<col(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*/?>)
```

```txt:最初の内容がcol要素の`&lt;colgroup&gt;`(厳密版)
<colgroup[ \t\n\f\r]*>(?=<col([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*/?>)
```

#### Note

1. 終了タグを省略したX要素にマッチしないパターンの戻り読みが出来ず、解決方法が不明。
[殆どの環境で可変長テキストの戻り読みはサポートされておらず](http://bokko.hatenablog.com/entry/20071201/1196513384)、多分詰んでいる。

2.  > (ただし空要素の場合省略できない)

    ここで言う*空要素*が何を示すのか不明。
    * 省略対象の colgroup 要素は、そもそも子要素に col 要素が含まれなければならず、空要素とはならない。
    * 内容に当たる col 要素は、そもそも常に空要素(閉じタグは無し)。
    * 直前の colgroup 要素については、空要素(中身の無い要素、閉じタグはルールにより省略不可)でも問題なし。

    <blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">(It can't be omitted if the element is empty.)</blockquote>

    [原文][12.1.2.4 Optional tags]にはこうある(「ただし」と書かれてはいない)ので、省略対象の colgroup 要素の事だと思われるが…

#### 例示

※要素(タグ)の間にある改行や空白文字、説明用のHTMLコメントは無視するものとする。

```html
<table>
  <caption>保元の乱</caption>
  <colgroup><!-- 直前にはcolgroup要素そのものが無いため、省略可 -->
    <col>
  </colgroup>
  <colgroup><!-- 直前のcolgroup要素は終了タグが省略されていないため、省略可 -->
    <col style="background:#f96;">
  <colgroup><!-- 直前のcolgroup要素は終了タグが省略されており、省略不可 -->
    <col style="background:#ffc;">
    <col style="background:#9fc;">
    <col style="background:#69f;">
  <tr>
    <th>
    <th>天皇家
    <th>藤原氏
    <th>平氏
    <th>源氏
  <tr>
    <th>天皇方
    <td>後白河
    <td>忠通
    <td>清盛
    <td>義朝
  <tr>
    <th>上皇方
    <td>崇徳
    <td>頼長
    <td>忠正
    <td>為義
</table>
```

参考: [colgroup要素｜(X)HTML辞典](https://w3g.jp/xhtml/dic/colgroup)

### `</colgroup>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-colgroup-element">colgroup</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-colgroup-element">colgroup</a></code> element is not immediately followed by a <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#space-character">space character</a> or a <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-comments">comment</a>.</blockquote>

> `</colgroup>` は直後に空白文字かコメントがなければ省略できる

```txt:簡易版
</colgroup\s*>(?!\s|<!--[\s\S]*?-->)
```

```txt:厳密版
</colgroup[ \t\n\f\r]*>(?![ \t\n\f\r]|<!--[\s\S]*?-->)
```

### `</caption>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-caption-element">caption</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-caption-element">caption</a></code> element is not immediately followed by a <a href="https://html.spec.whatwg.org/multipage/infrastructure.html#space-character">space character</a> or a <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-comments">comment</a>.</blockquote>

> `</caption>` は直後に空白文字かコメントがなければ省略できる

```txt:簡易版
</caption\s*>(?!\s|<!--[\s\S]*?-->)
```

```txt:厳密版
</caption[ \t\n\f\r]*>(?![ \t\n\f\r]|<!--[\s\S]*?-->)
```

### `</thead>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-thead-element">thead</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-thead-element">thead</a></code> element is immediately followed by a <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tbody-element">tbody</a></code> or <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tfoot-element">tfoot</a></code> element.</blockquote>

> `</thead>` は直後に tbody, tfoot 要素が続けば省略できる

```txt:簡易版
</thead\s*>(?=<(tbody|tfoot)(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*>)
```

```txt:厳密版
</thead[ \t\n\f\r]*>(?=<(tbody|tfoot)([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*>)
```

### `<tbody>`

**未完成**

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tbody-element">tbody</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-start-tag">start tag</a> may be omitted if the first thing inside the <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tbody-element">tbody</a></code> element is a <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tr-element">tr</a></code> element, and if the element is not immediately preceded by a <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tbody-element">tbody</a></code>, <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-thead-element">thead</a></code>, or <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tfoot-element">tfoot</a></code> element whose <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> has been omitted. (It can't be omitted if the element is empty.)</blockquote>

> `<tbody>` はその最初の内容が tr で、直前に終了タグを省略した tbody, thead, tfoot 要素がなければ省略できる

```txt:最初の内容がtr要素の`&lt;tbody&gt;`(簡易版)
<tbody\s*>(?=<tr(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*>)
```

```txt:最初の内容がtr要素の`&lt;tbody&gt;`(厳密版)
<tbody[ \t\n\f\r]*>(?=<tr([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*>)
```

#### Note

終了タグを省略したX要素にマッチしないパターンの戻り読みが出来ず、解決方法が不明。
[殆どの環境で可変長テキストの戻り読みはサポートされておらず](http://bokko.hatenablog.com/entry/20071201/1196513384)、多分詰んでいる。

### `</tbody>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tbody-element">tbody</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tbody-element">tbody</a></code> element is immediately followed by a <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tbody-element">tbody</a></code> or <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tfoot-element">tfoot</a></code> element, or if there is no more content in the parent element.</blockquote>

> `</tbody>` は直後に tbody, tfoot 要素が続くか、親要素にそれ以上内容がなければ省略できる

```txt:簡易版
</tbody\s*>(?=<(tbody|tfoot)(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*>|</[0-9a-zA-Z]+\s*>)
```

```txt:厳密版
</tbody[ \t\n\f\r]*>(?=<(tbody|tfoot)([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*>|</[0-9a-zA-Z]+[ \t\n\f\r]*>)
```

### `</tfoot>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tfoot-element">tfoot</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tfoot-element">tfoot</a></code> element is immediately followed by a <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tbody-element">tbody</a></code> element, or if there is no more content in the parent element.</blockquote>

> `</tfoot>` は直後に tbody 要素が続くか、親要素にそれ以上内容がなければ省略できる

```txt:簡易版
</tfoot\s*>(?=<tbody(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*>|</[0-9a-zA-Z]+\s*>)
```

```txt:厳密版
</tfoot[ \t\n\f\r]*>(?=<tbody([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*>|</[0-9a-zA-Z]+[ \t\n\f\r]*>)
```

### `</tr>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tr-element">tr</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tr-element">tr</a></code> element is immediately followed by another <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-tr-element">tr</a></code> element, or if there is no more content in the parent element.</blockquote>

> `</tr>` は直後に tr 要素が続くか、親要素にそれ以上内容がなければ省略できる

```txt:簡易版
</tr\s*>(?=<tr(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*>|</[0-9a-zA-Z]+\s*>)
```

```txt:厳密版
</tr[ \t\n\f\r]*>(?=<tr([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*>|</[0-9a-zA-Z]+[ \t\n\f\r]*>)
```

### `</td>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-td-element">td</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-td-element">td</a></code> element is immediately followed by a <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-td-element">td</a></code> or <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-th-element">th</a></code> element, or if there is no more content in the parent element.</blockquote>

> `</td>` は直後に td, th 要素が続くか、親要素にそれ以上内容がなければ省略できる

```txt:簡易版
</td\s*>(?=<(td|th)(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*>|</[0-9a-zA-Z]+\s*>)
```

```txt:厳密版
</td[ \t\n\f\r]*>(?=<(td|th)([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*>|</[0-9a-zA-Z]+[ \t\n\f\r]*>)
```

### `</th>`

<blockquote cite="https://html.spec.whatwg.org/multipage/syntax.html#optional-tags">A <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-th-element">th</a></code> element's <a href="https://html.spec.whatwg.org/multipage/syntax.html#syntax-end-tag">end tag</a> may be omitted if the <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-th-element">th</a></code> element is immediately followed by a <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-td-element">td</a></code> or <code><a href="https://html.spec.whatwg.org/multipage/tables.html#the-th-element">th</a></code> element, or if there is no more content in the parent element.</blockquote>

> `</th>` は直後に td, th 要素が続くか、親要素にそれ以上内容がなければ省略できる

```txt:簡易版
</th\s*>(?=<(td|th)(\s+[^\s"'>/=]+(\s*=\s*([^\s"'=><`]+|'[^']*'|"[^"]*"))?)*\s*>|</[0-9a-zA-Z]+\s*>)
```

```txt:厳密版
</th[ \t\n\f\r]*>(?=<(td|th)([ \t\n\f\r]+[^ \x00-\x1F\x7F"'>/=]+([ \t\n\f\r]*=[ \t\n\f\r]*([^ \t\n\f\r"'=><`]+|'[^\x00-\x08\x0B\x0E-\x1F\x7F']*'|"[^\x00-\x08\x0B\x0E-\x1F\x7F"]*"))?)*[ \t\n\f\r]*>|</[0-9a-zA-Z]+[ \t\n\f\r]*>)
```

[12.1.2.4 Optional tags]:https://html.spec.whatwg.org/multipage/syntax.html#optional-tags