3

jQueryがスクリプトタグを処理する方法のために、正規表現を使用してHTML操作を行う必要があることがわかりました(そうです、私は知っています...仕事に理想的なツールではありません)。残念ながら、JavaScriptでキャプチャされたグループがどのように機能するかについての私の理解には欠陥があるようです。これを試してみると、次のようになります。

var scriptTagFormat = /<script .*?(src="(.*?)")?.*?>(.*?)<\/script>/ig;

html = html.replace(
    scriptTagFormat, 
    '<span class="script-placeholder" style="display:none;" title="$2">$3</span>');

スクリプトタグはスパンに置き換えられますが、結果のtitle属性は空白になります。スクリプトタグの属性の$2内容と一致させるべきではありませんか?src

4

5 に答える 5

4

グループの入れ子は関係ありません。それらの番号付けは、正規表現内の開き括弧の位置によって厳密に決定されます。あなたの場合、それはsrc="value"シーケンス全体をキャプチャするのはグループ #1 であり、そのvalue一部だけをキャプチャするのはグループ #2 であることを意味します。

于 2011-05-05T20:42:51.840 に答える
1

これを試して:

/<script (?:(?!src).)*(?:src="(.*?)")?.*?>(.*?)<\/script>/ig

ここを参照してください:ルビュラー

ステマが書いたように、.*?一致が多すぎます。否定先読みを使用すると、属性(?:(?!src).)*までのみ一致します。src

しかし実際には、この場合.*?、 をオプションの部分に移動することもできます:

/<script (?:.*?src="(.*?)")?.*?>(.*?)<\/script>/ig

ここを参照してください:ルビュラー

于 2011-05-05T22:26:21.310 に答える
1

次の.*?グループはオプションであるため、一致が多すぎます。==> yoursrc.*?周囲の 1 つから一致します。?最初のグループの後に削除すると機能します。

更新: @morja が指摘したように、解決策は最初.*?のものをオプションの src 部分に移動することです。

完全を期すために:/<script (?:.*?(src="(.*?)"))?.*?>(.*?)<\/script>/ig

ここでルビュラーで見ることができます(私のリンクも修正しました)

最初のキャプチャ グループのコンテンツを使用したくない場合は、次を使用して非キャプチャ グループにします。(?:)

/<script (?:.*?(?:src="(.*?)"))?.*?>(.*?)<\/script>/ig

次に、必要な結果は $1 と $2 にあります。

于 2011-05-05T20:44:44.587 に答える
0

取得しているhtmlを投稿できますか?あなたのコードは、簡単な例で正常に動作します: jsfiddle (警告: アラート ボックス)

私の最初の推測では、スクリプト タグの 1 つに src がなく、単一のキャプチャ グループ (スクリプト コンテンツ) が残っていることを意味します。

于 2011-05-05T20:36:20.973 に答える
0

正規表現だけでは、探していることを正確に実行できないと考えているため、問題を回避するための変更を次に示します。

var scriptTagFormat = /<script\s+((.*?)="(.*?)")*\s*>(.*?)<\/script>/ig;

html = html.replace(
    scriptTagFormat, 
    '<span class="script-placeholder" style="display:none;" $1>$4</span>');

以前は、replacement に非標準の属性を設定することは避けたかったのspanです。このコードは、代わりにすべての属性をやみくもにコピーします。幸いなことに、HTML を挿入するときに非標準の属性が DOM から削除されないので、私の目的には問題ありません。

于 2011-05-05T22:15:31.467 に答える