7

RegEx へのリンクを開始する前に、XHTML 自己完結型タグを除くオープン タグに一致するように質問全体を読んでください。

何か新しいことを学ぶためだけに HTML パーサーを書きたいのですが (HTML 5 の場合のみ、HTML 5 かどうかをチェックし、そうでない場合はエラーを返します)、どうすればよいかわかりません。それを行う。例を示しましょう。

<!doctype html>
<html>
<head>
    <!-- #TITLE -->
    <title>Just an example</title>
</head>
<body>
    <p class='main'>Simple paragraph with an <a href='/a.html'>anchor</a></p>
</body>
</html>

さて、これを解析する方法を誰かに教えてもらえますか (最終的な形式は問題ではなく、単なる概念です)。いくつかのアイデア (再帰関数の使用、実際のタグを保持する配列への参照の作成など) はありましたが、これらが最良の概念ではなかったと思います。char ごとにチェックしてから、特定の関数を呼び出すか、正規表現を使用する必要がありますか (以下で説明します)。

正規表現を使用するということは、タグ全体に対して 1 つのパターンを意味するわけではありません。むしろ、tagname に 1 つのパターンを使用し (これが true を返す場合は次のパターンをチェックし)、次に attribute を使用し (これが true を返す場合は再度チェックし)、最後にタグの末尾をチェックすることを意味します。

タグを見つけたらどうすればいいですか?タグをチェックするループを実行します (タグが見つかった場合は、何度も呼び出します...)? しかし、私にとっては、関数XがXを呼び出すYを呼び出すと、再帰関数または少なくとも半再帰のように思えます...

最後の質問は、そのための最も効率的で正しい構造は何ですか?

4

2 に答える 2

5

SGML ベースのパーサーを作成する最大の部分はレクサーです。カスタム レクサーの構築に関する記事は次のとおりです: http://onoffswitch.net/building-a-custom-lexer/

私の意見では、正規表現はおそらくやり過ぎ/不適切です。HTML トークンを照合したい場合は、文字ごとの解析がおそらくこれを行うための最良の方法です。

于 2013-08-01T16:44:22.540 に答える