Parse HTML | Find Closing Tag | Attributes |
> を見つける
< (lt) が見つかったなら、次は、> (gt) を見つけて、タグの位置を確定する。
まずはシンプルなケースから始めよう。
以下の場合、有効なgtは、"span"の後に来る > である。
<span>
さて次はどうなるだろうか?
<span data-str="a>b">
この場合、最後のgtが、このタグを閉じる文字になる。
abの間にあるgtは、ストリングに中にあるので、閉じる文字にはならない。
同様にして、以下の例のようにsingle quoteでも、最後のgtが閉じる文字になる。
<span data-str='a>b'>
quoteがない場合はどうなるのか?
<span data-str=a>b>
この場合は、<span data-str=a>でひとつのタグとみなされる。
つまり、"..." か '...' 内にある > は無視されるが、
quoteなしのストリングでは、無視は起きない。
次にストリング外部に > があった場合を考える。
次の例では、<span data-str>がタグと認識されて、残りはテキストになる。
<span data-str>='ab'>
次の例では、<span data-str=>がタグと認識されて、残りはテキストになる。
<span data-str=>'ab'>
つまり、"..." か '...' 内にある > は無視され、外にあるのは、
タグを閉じる文字として認識される。
結局 "..." と '...' のストリングは認識する必要があるわけだたが、
HTMLのストリングは、PHPやJavaScriptにある \ のような、
エスケープ文字はあるのだろうか?
"...\"..."
'...\'...'
以下の文を読むと、答えは「無い」ということがわかる。
You can use single quotes inside double quotes or double quotes inside single quotes.
If you want to use single quotes inside single quotes or double quotes inside double quotes,
you have to HTML encode them.
結局、以下のように、HTMLエンコードした " をいれることになる。
<span data-str="A"B">
エスケープ文字を気にしなくていいぶん、パースは楽になるといっていい。
さて、ストリングといっても、Keyが無いValueはストリングとして扱われない。
下の例では、<span "x>がタグとなり、残りはテキストになる。
<span "x>y" data-str="ab">
つまり "x はValueのないKeyになるのである。
次に例もトリッキーだ。
<span data-str=#@$"a>b">
これは、<span data-str=#@$"a>でひとつのタグとなる。
なぜ a の後にくる > は無視されないのか?
一見すると > は"a>b"というdouble-quoteのストリングに
中にあるようにみえるのだが、実は、#@$"a>b" という
quote無しのストリングなのだ。
タグをパースするには、key=valueペアを意識する必要がある。
これを無視して、"..." と '...' をくくりだしても、
その中にある > を正しく解釈することはできない。
タグ内で、keyを探している時に出会った > は閉じ文字である。
タグ内で、quoteされたvalue内で > と出会った場合、無視できる。
しかし quoteされていないvalue内で > と出会った場合は閉じ文字である。