0

PHPやPerlなどを必要とせずに、相互互換性のあるターミナルツールを作成できるように、より良いawk方法で学習しようとしています。sed私は今、基本的に私がフェッチしたHTMLドキュメントの一部である非常に長い文字列をクリーンアップしようとしていますcurl。私はこれについて行くための最良の方法について疑問に思っています。

私が見つけたほとんどの解決策は、静的ファイルや構造などの贅沢を頼りにしていますが、フェッチされたHTMLコードをクリーンアップしようとしているので、文字列の「周辺」が大きく変化する可能性があると想定できるようにしたいと思います。サイズと構造。したがって、私ができる必要があると思うのは、基本的にHTMLタグを識別することです。これらは変更されない可能性が高いため、どこにいても、これらのHTMLタグからデータを抽出します。例は次のようになります。

<span class="unique-class">Payload</span>

そのHTMLタグ全体を検索できるようにする必要があります。見つかったら、aが見つかり、別のタグが開始さ>れるまで、基本的にすべてを抽出する必要があります。<

grep私の元のコードは、特定の単語(同じページの興味のないインスタンスに表示される可能性のある単語)に一致する行であるため、基本的に役に立たないので、私は本当に何でも開いています。

4

1 に答える 1

1

必要な文字列セグメントを見つけるために正規表現を使用する必要がありsedawkオプションとして正規表現を選択する必要がありますが、そのためにスイッチが必要になる場合があります。タグ全体を探すことをお勧めします。そうしないと、終了タグと開始タグ(</span>stuff here<p>)の間にコードが表示される可能性がありますが、これはおそらく望ましくありません。

したがって、正規表現は、最も基本的には次のようになります(テストされていないため、おそらく微調整する必要があります)。

/\<[a-zA-z]\>/ /* Find the opening tag. */ 
/\<[/a-zA-z]\>/ /* Find the closing tag, note the presence of the "/" inside the square brackets.
*/

必要に応じて、検索するタグのリストを作成できます。具体的には、次のようなものを提供します。

tags="div|p|article|section" /* Your list of tags, pipe-delimited for OR logic */
/\<$tags[:print:]\>/ /* The regex, looking for something like <div[anything]> */

開始タグをRegexingし、ベースタグを変数に格納してから、一致する終了タグを見つけることで、さらに先に進むことができる場合があります。これは、正しく機能するためにもう少し作業が必要になる場合がありますが、より堅牢であり、間違った終了タグで停止するという落とし穴を自然に回避するという利点があります(つまり、で停止</a>する必要があるときに停止し</p>ます)。

いくつかの注意事項-これは、いくつかの単一文字タグで少し毛むくじゃらになる可能性があります。十分にインテリジェントに記述しないと、プログラムがやなどを混乱させる可能性がある<a>ため<article>、コードがそれを説明するのに十分な堅牢性を備えていることを確認してください。

また、sはさまざまなフォーム入力のほとんどを生成するために使用されることを忘れないでください<input>。したがって、それらが何であるかを気にする場合は、にtype遭遇するたびに属性を探すようにしてください<input>

最後に、タグに終了タグがあるとは限りません。一部のタグには(<br/>/ <br><hr/>/ <hr>)がなく、HTML仕様では必ずしもそれらが必要では<li>ありません(次の開始タグが別のまたは、であるか、親の終了タグが続く<p>限り、終了タグは必要ありません) 。また、取得したHTMLが有効であると想定することもできません。したがって、これらの状況を考慮して、アプリケーションがクラッシュしたり燃えたりしないようにしてください。<li><p>

于 2013-03-20T13:53:23.983 に答える