0

ページで任意のスクリプト タグを検索し、スクリプト コンテンツを抽出する正規表現を作成しようとしています。任意の HTML 記述スタイルに対応するために、任意の数の空白文字を含むスクリプト タグを正規表現に含める必要があります (例:両方<script type = blahblah><script type=blahblah>見つかるはずです)。私の最初の試みはファンキーな結果に終わったので、問題をより単純なものに分解し、/\s*h\s*/g のような正規表現をテストして試してみることにしました。

文字列でテストすると、何らかの理由で「h」の周りの完全に任意の量の空白が一致し、他の任意の量は一致しません。たとえば、「 h 」のようなものは一致しますが、「 h 」は一致しません。なぜこれが発生したのか、または私が犯しているエラーについて誰かが知っていますか?

4

2 に答える 2

2

JavaScript を使用しているのに、なぜ使用できないのでしょgetElementsByTagName('script')うか。それがあなたがそれを行うべき方法です。

何らかの形で HTML 文字列がある場合は、iframe を作成し、HTML をその中にダンプしてから実行getElementsByTagName('script')します。

于 2012-07-06T19:12:11.910 に答える
0

OK、Kolinkの答えを拡張するために、iframeやイベントハンドラーは必要ありません。

var temp = document.createElement('div');
temp.innerHTML = otherHtml;
var scripts = temp.getElementsByTagName('script');

...現在、scriptsはスクリプト要素のDOMコレクションです-そしてスクリプトは実行されません...


正規表現がこのための素晴らしいアイデアではない理由:

<script>要素には文字列がどこにも含まれていない可能性があるため、それら</script>に一致する正規表現を作成することは難しくありません。/<script[.\n]+?<\/script>/gi

特定のタイプ属性を持つスクリプトのみを照合したいようです。あなたもそれをあなたのパターンに含めることを試みることができます:/<script[^>]+type\s*=\s*(["']?)blahblah\1[.\n]*?<\/script>/gi-しかしそれは恐ろしいです。(これは、不規則な文字列に正規表現を使用する場合に発生することです。単純化する必要があります)

したがって、代わりに、一致するすべての基本的なスクリプトを繰り返し処理し、開始タグを抽出します。result.match(/<script[^>]*>/i)[0]その中で、type属性を検索します/type\s*=\s*((["'])blahblah\2|\bblahblah\b)/.test(startTag)。ほら-恐ろしいことに戻った-単純化!

今回は正規化を介して: startTag = startTag.replace(/\s*=\s*/g, '=').replace(/=([^\s"'>]+)/g, '="$1"')-今あなたは危険な領域にいます=、引用された文字列の中にある場合はどうなりますか?それがどんどん複雑になっているのがわかりますか?

正規表現を使用してこの作業を行うことができるのは、使用するHTMLについて確固たる仮定を立てる場合(つまり、正規表現にする場合)のみです。そうでなければ、あなたの問題は成長し、成長し、成長します!

  • 免責事項:私は、彼らが私が言うことを実行するかどうかを確認するために使用される正規表現をテストしていません。それらは単なる例の試みです。
于 2012-07-06T19:53:41.547 に答える