0

質問のタイトルにすべてを入れるのは難しいです。具体的なことは、人々が分割したい文字列に依存するためです。しかし、ここにあります:

複数のスクリプト タグが含まれる文字列があります。

<script type="text/javascript" src="/javascripts/something-1.js"></script>
<script type="text/javascript" src="/javascripts/something-2.js"/>
<script type="text/javascript" src="/javascripts/something-3.js"></script>
<link rel="stylesheet" type="text/css" href="/something-1.css">

この文字列を複数の文字列に分割したいのですが、それぞれにスクリプト タグが含まれています (リンク タグは無視します)。これが私がやった方法です:

var scripts = code.match(/<script.*src=.*(\/>|<\/script>)/g);

これは、スクリプト タグを終了タグまたは のいずれかと一致させるため/>です</script>。ただし、この現在の正規表現では、常に次のようになります。

<script type="text/javascript" src="/javascripts/something-1.js"></script>
<script type="text/javascript" src="/javascripts/something-2.js"/>

文字列として - 2 つではありません。

次のような正規表現を行うにはどうすればよいですか:

/<script.*src=( (not script not link) /> | (not link) <\/script> )/g
4

4 に答える 4

2

可能な限り一致するのではなく、可能な限り一致しないように に変更.*します。.*?

于 2012-04-24T23:24:33.763 に答える
2

一般的に言えば、あなたがやろうとしていることは不可能です。しかし、ソース文字列について単純化する特定の仮定を立てることができれば、十分に優れた正規表現を作成できます。これが私が試すことです:

/<script(?:\s+\w+\s*=\s*"[^"]*")+\s*/?>(?:</script>)?/gi

説明:

  • <script開始タグの先頭に一致します。

  • (?:\s+\w+\s*=\s*"[^"]*")+1 つ以上の属性を消費します

  • \s*/?>開始タグの末尾に一致します。自己終了タグの場合、/?はスラッシュを消費します。

  • \s*(?:</script>)?それ以外の場合、これは終了タグに一致します。

.*基本的な考え方は、開始タグの末尾にある を一致できないものに置き換えて、>必要以上に一致するように「エスケープ」することです。もちろん、保証はありません。あなたの HTML が有効かどうかさえわかりません。有効な HTML であっても、この正規表現をだます方法はたくさんあります。

于 2012-04-25T01:51:05.917 に答える
2

これを処理する別の方法は、xmldom を使用して「src」を「script」タグの属性として使用し、ページを部分的または完全な xml ドキュメントとして取り込むことです。それらをつかみ、リンクを避けるのは積極的な方法です。

于 2012-04-24T23:33:07.750 に答える
1

私は次のようなものを使用します

var rx = /<script.+?src=.+?\/(script)?>/gim;

これは何にでもマッチします:

  • で始まります<script
  • 少なくとも 1 文字以上あること (たとえば、スペース、またはその他の属性と値のペアである可能性があります)
  • 持つsrc=
  • あと1文字以上
  • 次に、/>または/script>

そしてフラグ…</p>

  • iフラグは大文字と小文字を区別しないためのものです
  • gフラグは複数の一致用です
  • mフラグは複数行のソース用です (これらの行が実際には行自体であり、合計で 1 行ではないと仮定します)

編集: src属性&src=etcの値のアドレスのような get 値を持つ可能性を考慮していませんでした。

于 2012-04-25T00:41:55.117 に答える