1. ホーム
  2. html

[解決済み] 正規表現でXMLやHTMLを解析するのが難しい理由を、いくつか例を挙げて教えてください。[クローズド]です。

2022-03-25 19:06:27

質問内容

私がよく目にする間違いは 以上 もう一回 は、正規表現でXMLやHTMLを解析しようとしています。 XMLやHTMLの解析が困難な理由をいくつか挙げてみましょう。

ファイルを行の連続として扱いたがる人がいるが、これは有効である。

<tag
attr="5"
/>

タグの先頭を<や<タグとして扱いたがる人がいますが、こんなものが野放しにされているんですね。

<img src="imgtag.gif" alt="<img>" />

開始タグと終了タグをマッチさせたい人はよくいますが、XMLとHTMLではタグが自分自身を含むことができます(従来の正規表現ではまったく扱えません)。

<span id="outer"><span id="inner">foo</span></span> 

人々はしばしばドキュメントのコンテンツに対してマッチングを行いたいが(有名な "指定されたページ上のすべての電話番号を見つける"問題など)、データは(見たところ正常であっても)マークアップされている可能性がある。

<span class="phonenum">(<span class="area code">703</span>)
<span class="prefix">348</span>-<span class="linenum">3020</span></span>

コメントには、不適切な書式のタグや不完全なタグが含まれることがあります。

<a href="foo">foo</a>
<!-- FIXME:
    <a href="
-->
<a href="bar">bar</a>

その他に、どのようなゴチャゴチャがありますか?

解決方法は?

ここで、楽しい有効なXMLを紹介します。

<!DOCTYPE x [ <!ENTITY y "a]>b"> ]>
<x>
    <a b="&y;>" />
    <![CDATA[[a>b <a>b <a]]>
    <?x <a> <!-- <b> ?> c --> d
</x>

そして、この小さな喜びの塊は、有効なHTMLです。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" [
    <!ENTITY % e "href='hello'">
    <!ENTITY e "<a %e;>">
]>
    <title>x</TITLE>
</head>
    <p id  =  a:b center>
    <span / hello </span>
    &amp<br left>
    <!---- >t<!---> < -->
    &e link </a>
</body>

無効な構文に対するブラウザ固有のパース処理は言うまでもありません。

正規表現に対抗できるよう頑張ってください。

EDIT (Jörg W Mittag): ここにもう一つ、整形式で有効なHTML 4.01の素晴らしい作品があります。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  "http://www.w3.org/TR/html4/strict.dtd"> 
<HTML/
  <HEAD/
    <TITLE/>/
    <P/>