正規表現を使用してHTMLを解析する:なぜそうしないのですか?


207

質問者が正規表現を使用してHTMLから一部の情報を取得する、stackoverflowのすべての質問には、必然的に正規表現を使用してHTMLを解析しないことを示す「回答」が含まれます。

何故なの?Beautiful Soupのように、引用符で囲まれていない「実際の」HTMLパーサーが存在することは承知しており、パワフルで便利だと確信していますが、単純、迅速、またはダーティなことをしているのであれば、その理由はいくつかの正規表現が問題なく機能するときに、複雑なものを使用するのは面倒ですか?

さらに、私が正規表現について理解していない根本的なものがあって、それらを一般的に解析するのに悪い選択にしていますか?



23
なぜなら、チャックノリスだけが正規表現でHTMLを解析できるからです(この有名なZalgoの事柄で説明されているように:stackoverflow.com/questions/1732348/…)。
takeshin

1
この質問は私に何らかの形で関連している別のものを尋ねるように促しました。興味がある場合:なぜ正規表現を使用してHTML / XMLを解析できないのか:素人の言葉による正式な説明
Mac


この質問は、「一般的な検証タスク」のスタックオーバーフローの正規表現に関するFAQに追加されました。
aliteralmind 2014

回答:


212

正規表現ではHTMLの完全な解析はできません。これは、正規表現では不可能である開始タグと終了タグのマッチングに依存しているためです。

正規表現は正規言語にのみ一致しますが、HTMLは文脈自由言語あり、正規言語ではありません(@StefanPochmannが指摘したように、正規言語も文脈自由なので、文脈自由は必ずしも規則的ではありません)。HTMLの正規表現でできることはヒューリスティックだけですが、すべての条件で機能するわけではありません。正規表現によって誤って照合されるHTMLファイルを提示する可能性があります。


26
これまでのベストアンサー。通常の文法にのみ一致する場合は、HTMLのような文脈自由文法を解析するために無限に大きい正規表現が必要になります。これらが明確な理論的答えを持っているとき、私は大好きです。
ntownsend 2009

2
私たちは、実際には正規表現ではないPerlタイプの正規表現について説明していると思いました。
ハンクゲイ

5
実際、.Net正規表現は、バランスグループと慎重に作成された表現を使用して、開始タグと終了タグをある程度一致させることができます。含むすべての正規表現ではまだ当然の狂気であることのを、それは素晴らしいコードChtulhuのようになりますし、おそらく同様に本物を召喚します。そして結局、それはまだすべての場合に機能しません。彼らは、HTMLを正しく解析できる正規表現を作成すると、宇宙はそれ自体に崩壊すると言っています。
Alex Paven

5
一部の正規表現ライブラリは、再帰的な正規表現を実行できます(事実上、それらを非正規表現にします:)
OndraŽižka

43
-1この答えは、間違った引数(「HTMLは通常の言語ではないため」)から正しい結論(「正規表現でHTMLを解析することは悪い考えです」)を導き出します。今日、ほとんどの人が「正規表現」(PCRE)を言うときに意味することは、文脈自由文法(実際には些細なこと)の解析だけでなく、文脈依存文法(stackoverflow.com/questions/7434272/ …)。
NikiC、2011

35

素早い汚れに対しては正規表現で問題ありません。ただし、知っておくべき基本的なことは、HTML を正しく解析する正規表現を作成することは不可能であることです。

その理由は、正規表現が任意にネストされた式を処理できないためです。正規表現を使用して、ネストされたパターンを照合できますか?を参照してください


1
一部の正規表現ライブラリは、再帰的な正規表現を実行できます(事実上、それらを非正規表現にします:)
OndraŽižka

23

http://htmlparsing.com/regexesから)

<img>タグからURLを抽出しようとしているHTMLファイルがあるとします。

<img src="http://example.com/whatever.jpg">

したがって、Perlで次のような正規表現を記述します。

if ( $html =~ /<img src="(.+)"/ ) {
    $url = $1;
}

この場合、$url実際にはが含まれます http://example.com/whatever.jpg。しかし、次のようなHTMLを取得し始めるとどうなりますか。

<img src='http://example.com/whatever.jpg'>

または

<img src=http://example.com/whatever.jpg>

または

<img border=0 src="http://example.com/whatever.jpg">

または

<img
    src="http://example.com/whatever.jpg">

またはあなたはから偽陽性を得始めます

<!-- // commented out
<img src="http://example.com/outdated.png">
-->

それはとてもシンプルに見え、単一の変更されないファイルの場合はシンプルかもしれませんが、任意のHTMLデータに対して実行することになるすべてのことについて、正規表現は将来の心痛のレシピにすぎません。


4
これは本当の答えのようです-今日の正規表現は単なるオートマトンではないため、正規表現で任意のHTMLを解析することはおそらく可能ですが、任意のhtmlを解析するだけでなく、具体的なページを解析するために、正規表現でHTMLパーサーを再実装する必要がありますそして、正規表現は確かに1000回読めなくなります。
Smit Johnth、2015

1
ちょっとアンディ、あなたの言及されたケースをサポートする表現を思いつくために時間をかけました。stackoverflow.com/a/40095824/1204332ご意見をお聞かせください。:)
Ivan Chaer 2016年

2
この答えでは推論がある(私はそれがなかったと思われた)古い、そしてそれは、もともとやったよりも今日も、以下に適用されます。(OPを引用:「単純な、迅速な、または汚いことをしているだけの場合...」
Sz。

16

2つの簡単な理由:

  • 悪意のある入力に対抗できる正規表現を書くのは難しいです。ビルド済みのツールを使用するよりも難しい
  • 必然的に行き詰まるとんでもないマークアップを処理できる正規表現を書くのは難しいです。ビルド済みのツールを使用するよりも難しい

一般的な解析のための正規表現の適合性について:それらは適切ではありません。ほとんどの言語を解析するために必要な種類の正規表現を見たことがありますか?


2
ワオ?2年以上後の反対投票?誰かが疑問に思っている場合のために、質問は「正しい」ではなく「迅速かつ汚い」について明確に尋ねられたため、「理論的には不可能だから」とは言いませんでした。OPは、理論的に不可能な領域をカバーし、まだ満足されなかった回答をすでに明確に読んでいます。
ハンクゲイ

1
5年以上後に賛成票を投じます。:)なぜあなたが反対票を受け取ったのかについては、私は言う資格がありませんが、個人的には、終了の修辞的な質問ではなく、いくつかの例や説明を見てみたいと思います。
アダムジェンセン

3
基本的に、製品や内部ツールの出荷で行われるすべての迅速で汚いhtml解析は、セキュリティホールの拡大、またはバグの発生を待っています。ガストで落胆する必要があります。正規表現を使用できる場合は、適切なHTMLパーサーを使用できます。
2015

16

解析に関する限り、正規表現は、入力がトークンに分解される「字句解析」(レクサー)ステージで役立ちます。実際の「構文解析ツリーの構築」段階ではあまり役に立ちません。

HTMLパーサーの場合、整形式のHTMLのみを受け入れることが期待されます。これには、正規表現で実行できる機能以外の機能が必要です(これらは「カウント」できず、指定された数の開始要素が同じ数でバランスされていることを確認できません)終了要素の)。


8

ブラウザーがかなり寛大な方法で扱うHTMLを「ねじ込む」には多くの方法がありますが、ブラウザーの自由な動作を再現して正規表現ですべてのケースをカバーするにはかなりの労力が必要です。場合、それはあなたのシステムに深刻なセキュリティギャップをもたらす可能性があります。


1
確かに、世の中に出回っているHTMLの大部分は恐ろしいようです。正規表現の失敗がどのようにして深刻なセキュリティギャップを招くのか理解できません。例を挙げていただけますか?
ntownsend 2009

4
ntownsend:たとえば、HTMLからすべてのスクリプトタグを取り除いたと思いますが、正規表現は特殊なケース(つまり、IE6でのみ機能する)に失敗します:ブーム、XSSの脆弱性があります!
Tamas Czinege、2009

1
ほとんどの現実世界の例は複雑すぎてこれらのコメントに収まらないため、これは厳密に架空の例でしたが、主題をすばやくグーグルで検索するといくつか見つかる可能性があります。
Tamas Czinege、2009

3
セキュリティアングルについて言及する場合は+1。インターネット全体に接続しているときは、ハックな「ほとんどの場合機能する」コードを書く余裕はありません。
j_random_hacker 2009

7

問題は、HTMLと正規表現に関連する質問をするほとんどのユーザーが、動作する独自の正規表現を見つけられないためにこれを行うことです。次に、DOMパーサーまたはSAXパーサーなどを使用すると、すべてが簡単になるかどうかを考える必要があります。XMLに似たドキュメント構造で作業するために最適化および構築されています。

もちろん、正規表現で簡単に解決できる問題があります。しかし、重点は簡単にあります

http://.../正規表現で問題ないように見えるすべてのURLを検索したいだけの場合。ただし、クラス「mylink」を持つa要素内にあるすべてのURLを検索する場合は、適切なパーサーを使用する方がよいでしょう。


6

正規表現は、ネストされたタグ構造を処理するようには設計されていません。実際のHTMLで発生する可能性のあるすべてのエッジケースを処理することは、せいぜい(最悪の場合、不可能)複雑です。


6

答えは計算理論にあると思います。正規表現を使用して言語を解析するには、定義上、「標準」(リンク)である必要があります。HTMLは、通常の言語の多くの基準を満たさないため、通常の言語ではありません(HTMLコードに固有の多くのレベルのネストに関係しています)。計算理論に興味があるなら、この本をお勧めます。


1
私は実際にその本を読みました。HTMLが文脈自由言語であることは私には思いもよらないことでした。
ntownsend 2009

4

この式は、HTML要素から属性を取得します。それはサポートします:

  • 非引用/引用属性
  • 一重/二重引用符、
  • 属性内の引用符のエスケープ、
  • 等号の周りのスペース
  • 任意の数の属性、
  • タグ内の属性のみをチェックし、
  • コメントをエスケープし、
  • 属性値内の異なる引用符を管理します。

(?:\<\!\-\-(?:(?!\-\-\>)\r\n?|\n|.)*?-\-\>)|(?:<(\S+)\s+(?=.*>)|(?<=[=\s])\G)(?:((?:(?!\s|=).)*)\s*?=\s*?[\"']?((?:(?<=\")(?:(?<=\\)\"|[^\"])*|(?<=')(?:(?<=\\)'|[^'])*)|(?:(?!\"|')(?:(?!\/>|>|\s).)+))[\"']?\s*)

ご覧ください。デモのように、「gisx」フラグを使用するとよりうまく機能します。


1
それはとても興味深いです。読めない、おそらくデバッグが難しいがそれでも:印象的な作業!
Eric Duminil、2016

これはまだ、HTMLが整形式であることを漠然と想定しています。コンテキストマッチングがない場合、これは、<script>タグ内のJavaScriptコードのように、通常は一致させたくないコンテキストの見かけのURLに一致します。
tripleee

4

HTML / XMLは、マークアップとコンテンツに分かれています。正規表現は、字句タグの解析を行う場合にのみ役立ちます。内容を推測できると思います。SAXパーサーに適しています。タグとコンテンツは、要素のネスト/クローズを追跡できるユーザー定義関数に配信できます。

タグの解析に関する限り、正規表現を使用してタグを解析し、ドキュメントからタグを取り除くことができます。

長年のテストの結果、私はブラウザがタグを正しく解析する方法と不正な方法の両方を解析する方法の秘密を発見しました。

通常の要素は次の形式で解析されます:

これらのタグのコアはこの正規表現を使用します

 (?:
      " [\S\s]*? " 
   |  ' [\S\s]*? ' 
   |  [^>]? 
 )+

これ[^>]?は代替の1つとして気付くでしょう。これは、不正な形式のタグからの不均衡な引用に一致します。

それはまた、正規表現に対するすべての悪の最も根源的なものでもあります。それが使用される方法は、それの貪欲で、一致しなければならない定量化されたコンテナを満足させるために衝突を引き起こします。

パッシブに使用すれば問題はありませんが、必要な属性/値のペアを挿入することによって何かを強制的に一致させ、バックトラックからの適切な保護を提供しない場合、それは制御不能の悪夢です。

これは単純な古いタグの一般的な形式です。[\w:]タグ名を表すことに注意してください ?実際には、タグ名を表す有効な文字は、信じられないほどのUnicode文字のリストです。

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

さらに、すべてのタグを解析せずに特定のタグを検索できないこともわかります。つまり、可能ですが、(* SKIP)(* FAIL)のような動詞の組み合わせを使用する必要がありますが、それでもすべてのタグを解析する必要があります。

その理由は、タグ構文が他のタグなどの中に隠れている可能性があるためです。

したがって、すべてのタグを受動的に解析するには、以下のような正規表現が必要です。この特定のものは、非表示のコンテンツにも一致します。

新しいHTML、xml、またはその他の新しい構成要素が開発されたら、それを代替の1つとして追加するだけです。


Webページのメモ-これで
問題が発生したWebページ(またはxhtml / xml)を見たことがありません。見つけた場合はお知らせください。

パフォーマンスのメモ-簡単です。これは、私が見た中で最も速いタグパーサーです
(知っている方が速いかもしれません)。
特定のバージョンがいくつかあります。スクレーパーとしても優れて
います(ハンズオンタイプの場合)。


完全な生の正規表現

<(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\s+(?>"[\S\s]*?"|'[\S\s]*?'|(?:(?!/>)[^>])?)+)?\s*>)[\S\s]*?</\1\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]*?))))>

フォーマットされた外観

 <
 (?:
      (?:
           (?:
                # Invisible content; end tag req'd
                (                             # (1 start)
                     script
                  |  style
                  |  object
                  |  embed
                  |  applet
                  |  noframes
                  |  noscript
                  |  noembed 
                )                             # (1 end)
                (?:
                     \s+ 
                     (?>
                          " [\S\s]*? "
                       |  ' [\S\s]*? '
                       |  (?:
                               (?! /> )
                               [^>] 
                          )?
                     )+
                )?
                \s* >
           )

           [\S\s]*? </ \1 \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]*? )
           )
      )
 )
 >

3

「場合によります」。ここに記載されているすべての理由により、正規表現がHTMLを正確に解析できないこと、および解析できないことは事実です。ただし、それを誤る結果(ネストされたタグを処理しないなど)が軽微であり、正規表現が環境で非常に便利な場合(Perlをハッキングする場合など)は、先に進んでください。

サイトにリンクしているWebページを解析しているとしましょう(おそらく、Googleリンク検索で見つけた可能性があります)。リンクを取り巻くコンテキストの一般的なアイデアをすばやく取得したいと考えています。スパムのリンクを警告するような小さなレポートを実行しようとしています。

その場合、一部のドキュメントを誤って解析することは大きな問題にはなりません。誰もが間違いを見ることになるでしょう、そしてあなたが非常に運が良ければ、あなたが個別にフォローアップできるほど十分にはありません。

私はそれがトレードオフだと言っていると思います。正確なパーサーを実装または使用することは、正確であることが重要でない場合は、問題なく簡単です。

仮定に注意してください。たとえば、公開されるものを解析しようとしている場合に、正規表現のショートカットが逆効果になるいくつかの方法を考えることができます。


3

正規表現を使用してHTMLからいくつかの情報を解析することが正しい方法である場合は確かにあります-それは特定の状況に大きく依存します。

上記のコンセンサスは、一般的にそれは悪い考えであるということです。ただし、HTML構造がわかっている場合(変更される可能性が低い場合)、それでも有効なアプローチです。


3

HTML自体は規則的ではありませんが、表示しているページの一部が規則的である可能性があることに注意してください。

たとえば、<form>タグをネストするとエラーになります。Webページが正しく機能している場合、正規表現を使用してを取得する<form>ことは完全に合理的です。

最近、Seleniumと正規表現のみを使用してWebスクレイピングを行いました。私は私が望んでいたデータを入れたので、それで逃げた<form>(私も数えることができるように、簡単な表形式で入れ<table><tr>そして<td>-実際には非常に珍しいとする非入れ子にします)。アクセスに必要な構造の一部がコメントで区切られていたため、ある程度、正規表現はほとんど必要でさえありました。(Beautiful Soupはあなたにコメントを与えることができますが、Beautiful Soupを使ってつかん<!-- BEGIN --><!-- END -->ブロックすることは困難でした。)

ただし、ネストしたテーブルについて心配する必要がある場合は、私のアプローチではうまくいきませんでした。Beautiful Soupに頼らなければならなかっただろう。ただし、それでも、正規表現を使用して必要なチャンクを取得し、そこからドリルダウンできる場合があります。


2

実際、正規表現によるHTML解析はPHPでは完全に可能です。ネストされたタグを取得するために毎回、貪欲な指定子を使用してそこから正規表現strrposを見つけ<て繰り返すために使用して、文字列全体を逆方向に解析する必要があります。大きなものでは空想的ではなく、ひどく遅いですが、私はそれを自分のウェブサイトの個人用テンプレートエディターに使用しました。私は実際にはHTMLを解析していませんでしたが、データベースエントリをクエリしてデータのテーブルを表示するために作成したいくつかのカスタムタグ(私の<#if()>タグは、このようにして特別なエントリを強調表示できます)。私は、あちこちにいくつかの自己作成タグ(その中に非常に非XMLデータがある)だけをXMLパーサーに使用する準備ができていませんでした。

したがって、この質問はかなり死んでも、Google検索には表示されます。私はそれを読み、「チャレンジは受け入れられる」と考え、すべてを置き換える必要なしに簡単なコードを修正しました。同様の理由を探している人に別の意見を提供することにしました。また、最後の回答は4時間前に投稿されたため、これはまだホットなトピックです。


2
ひどい考えを示唆するための-1。タグと閉じ山かっこの間の空白を考慮しましたか?(例<tag >)コメントアウトされた終了タグを検討しましたか?(例<tag> <!-- </tag> -->)CDATAを検討しましたか?一貫性のないケースのタグを検討しましたか?(例<Tag> </tAG>これも考慮ましたか?
rmunn 2014

1
少数のカスタムタグの特定のケースでは、はい、正規表現がうまく機能します。したがって、それらの使用が特定のケースでの誤りだったということではありません。ただし、これはHTMLではありません。「正規表現を使用したHTML解析はPHPで完全に可能です」というのは、まったくの誤りであり、ひどい考えです。実際のHTMLの不整合(および、リストされた数よりもはるかに多い)が、正規表現で実際のHTMLを解析してはならない理由です。この質問に対する他のすべての回答と、上記の他のコメントでリンクした回答を参照してください。
rmunn 2014

2
PHPはチューリング完全な言語であるため、完全に偽というわけではありません。HTMLの解析を含め、計算上可能なすべてのことが可能です。タグ内のスペースが問題になることはありませんでしたので、タグ要素を順番にリストするように調整しました。最初の段階で、一貫性のない大文字小文字を含む自動修正されたタグ、コメント化されたものを使用し、後で追加すると、あらゆる種類のタグを簡単に追加できます(大文字と小文字は区別されますが、自分で選択できます)。そして、CDATAは実際にはHTML要素ではなくXML要素であると確信しています。
デジ2014

2
私の古い方法(ここで説明しました)はかなり非効率的で、最近、多くのコンテンツエディターの書き直しを始めました。これらのことを行う場合、可能性は問題ではありません。最良の方法は常に主な関心事です。本当の答えは「PHPでそれを行う簡単な方法はない」です。PHPでそれを行う方法はないとか、それはひどい考えだと誰も言っていませんが、私が正直に試したことがない正規表現では不可能ですが、私の答えの1つの大きな欠陥は、質問が正規表現を参照していると想定したことですPHPのコンテキスト内では、必ずしもそうとは限りません。
デジ2014

2

私もこれについて正規表現を試してみました。主に次のHTMLタグとペアになっているコンテンツのチャンクを見つけるのに役立ちます。また、一致する終了タグは検索しませんが、終了タグを取得します。自分の言語でスタックをロールして、それらをチェックします。

'sx'オプションとともに使用します。運が良ければ 'g'も:

(?P<content>.*?)                # Content up to next tag
(?P<markup>                     # Entire tag
  <!\[CDATA\[(?P<cdata>.+?)]]>| # <![CDATA[ ... ]]>
  <!--(?P<comment>.+?)-->|      # <!-- Comment -->
  </\s*(?P<close_tag>\w+)\s*>|  # </tag>
  <(?P<tag>\w+)                 # <tag ...
    (?P<attributes>
      (?P<attribute>\s+
# <snip>: Use this part to get the attributes out of 'attributes' group.
        (?P<attribute_name>\w+)
        (?:\s*=\s*
          (?P<attribute_value>
            [\w:/.\-]+|         # Unquoted
            (?=(?P<_v>          # Quoted
              (?P<_q>['\"]).*?(?<!\\)(?P=_q)))
            (?P=_v)
          ))?
# </snip>
      )*
    )\s*
  (?P<is_self_closing>/?)   # Self-closing indicator
  >)                        # End of tag

これはPython用に設計されています(他の言語でも機能する可能性があり、まだ試していません。ポジティブ先読み、ネガティブ後読み、および名前付き後方参照を使用しています)。サポート:

  • タグを開く- <div ...>
  • タグを閉じる- </div>
  • コメント- <!-- ... -->
  • CDATA- <![CDATA[ ... ]]>
  • 自己終了タグ- <div .../>
  • オプションの属性値- <input checked>
  • 引用符で囲まれていない/引用符で囲まれた属性値- <div style='...'>
  • 一重/二重引用符- <div style="...">
  • エスケープされた引用- <a title='John\'s Story'>
    (これは本当に有効なHTMLではありませんが、私はいい人です)
  • 等号の周りのスペース- <a href = '...'>
  • 興味深いビットの名前付きキャプチャ

また、あなたが忘れてしまったときのように、不正なタグにトリガーないことについて、かなり良いことだ<かを>

あなたの正規表現フレーバーが名前付きキャプチャの繰り返しをサポートしている場合、あなたはゴールデンですが、Python reはそうではありません(正規表現はサポートしていますが、通常のPythonを使用する必要があります)。ここにあなたが得るものがあります:

  • content-次のタグまでのすべてのコンテンツ。これは省略できます。
  • markup -すべてが入ったタグ全体。
  • comment -コメントの場合、コメントの内容。
  • cdata-の場合<![CDATA[...]]>、CDATAの内容。
  • close_tag-終了タグ(</div>)の場合は、タグ名。
  • tag-開始タグ(<div>)の場合、タグ名。
  • attributes-タグ内のすべての属性。繰り返しグループを取得しない場合は、これを使用してすべての属性を取得します。
  • attribute -繰り返し、各属性。
  • attribute_name -繰り返し、各属性名。
  • attribute_value-繰り返し、各属性値。引用されている場合は、引用符も含まれます。
  • is_self_closing-これは/自己終了タグの場合であり、それ以外の場合は何もありません。
  • _qおよび_v-これらを無視します。それらは内部で後方参照に使用されます。

正規表現エンジンが名前付きキャプチャの繰り返しをサポートしていない場合は、各属性を取得するために使用できるセクションが呼び出されます。ただ、上のその正規表現を実行しattributes、それぞれを取得するグループattributeattribute_nameおよびattribute_valueそれから。

デモはこちら:https : //regex101.com/r/mH8jSu/11


1

正規表現は、HTMLのような言語には十分強力ではありません。もちろん、正規表現を使用できる例がいくつかあります。ただし、一般的には解析には適していません。


0

あなたが知っている...あなたがそれを行うことはできないという多くの考え方があります、そして私はフェンスの両側の誰もが正しいと間違っていると思います。あなたはCANそれを行うが、それはそれに対して1つの正規表現を実行しているよりも、処理はもう少しかかります。例としてこれ(私は1時間以内に書いた)を取り上げます。これはHTMLが完全に有効であることを前提としていますが、前述の正規表現を適用するために使用している言語によっては、HTMLを修正して、HTMLが成功することを確認できます。たとえば、存在しないはずの終了タグを削除します</img>。次に、閉じている単一のHTMLスラッシュを、それらが欠落している要素に追加します。

これは、JavaScriptのようなHTML要素の検索を実行できるライブラリを作成する状況で使用します[x].getElementsByTagName()。正規表現のDEFINEセクションで記述した機能をつなぎ合わせて、要素のツリー内を一度に1つずつステップ実行するために使用します。

それで、これはHTMLを検証するための最後の100%回答になりますか?いいえ。しかし、それは始まりであり、もう少し作業を行うことで、それを実行できます。ただし、1つの正規表現実行の中でそれを実行することは、実用的でも効率的でもありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.