2

CFHTTP リクエスト経由で受け取った HTML コンテンツから JavaScript コードを抽出しようとしています。

タグ間のコードに改行がない限り、すべてをキャッチするこの単純な正規表現があります。

var result=REMatch("<script[^>]*>(.*?)</script>",html);

これはキャッチします:

<script>testtesttest</script<

だがしかし

<script>
testtest

</script>

複数行に (?m) を使用しようとしましたが、そのようには機能しません。私はそれを理解するために参照を使用していますが、正規表現では取得できません。

注意してください。通常、スクリプト タグの間には単純なテキストではなく、{}();:-_ などの文字も含まれる JavaScript があります。

誰でも私を助けることができますか?

乾杯

[[UPDATE]] ありがとうございます。解決策を試してみます。私は正規表現を好みますが、HTML パーサーも調べます。

4

2 に答える 2

8

(?m)複数行モードは、改行を作成^して$一致させるためのものです(デフォルトのように文字列の開始/終了だけではありません)が、ここでやろうとしていること.は、改行を含めることです-そのために必要です(?s)(ドットオールモード)。

ただし、おそらく正規表現ではこれを行いません。HTML パーサーの方がより堅牢なソリューションです。jSoupでそれを行う方法は次のとおりです。

var result = jsoup.parse(html).select('script').text();

CF で jSoup を使用する方法の詳細については、こちらを参照してください。または、CF10 に同梱されているTagSoupパーサーを使用することもできます(したがって、jar などについて心配する必要はありません)。


本当に正規表現が必要な場合は、これを使用できます。

var result = rematch('<script[^>]*>(?:[^<]+|<(?!/script>))+',html);

これを使用するのとは異なり、(?s).*?空のブロックの一致を回避します (ただし、特定のエッジ ケースでは失敗します - 正確さが必要な場合は、HTML パーサーを使用します)。

最初のスクリプト ブロックからテキストだけを抽出するには、次のようにスクリプト タグを削除します。

result = ListRest( result[1] , '>' );
于 2012-10-25T21:54:18.177 に答える
0

ドットマッチオールモードを使用するか、に置き換える.[\s\S]同じ効果が得られます。

<script[^>]*>[\s\S]*?</script> would match everything including newlines.
于 2012-10-25T21:59:23.873 に答える