2

最後に画像ファイル拡張子を含む URL を一致させようとすると、奇妙な問題が発生します。使用している正規表現は非常に単純です (URL 検証自体はありませんが、今のところ最初の反復で行います)。

言葉で説明するよりもうまく説明できるフィドルを設定しました。ここでフィドルを参照してください:

http://jsfiddle.net/Vwat2/1/

ノート:

  1. クロムでのテストを確認してください
  2. Chrome のタスク マネージャーが開いていることを確認します (設定アイコン > ツール > タスク マネージャー)。
  3. jsfiddle を実行すると、URL をテキストエリアにコピーしてから 3 秒後に最後にファイル拡張子が一致しない正規表現が起動し、問題が発生した場合はその 3 秒後にファイル拡張子が一致する正規表現が起動します。 、テキストは「起動」に変更されず、タスク マネージャーで jsfiddle が CPU を消費することがわかります。

ここで何が起こっているのか誰かが説明できることを願っています.PHPとexpressoで正規表現を実行しましたが、問題はないので、ある種の正規表現内部ループなどでスタックしているとは思いません.

助けてくれてありがとう

編集:私のアプリケーションでの使用にもっとよく似たスリム化されたバージョンがあります(最初のフィドルからタイマーと他のヘルパーを削除しました)。

http://jsfiddle.net/A96Mw/1/

4

2 に答える 2

3

2 つの言葉:壊滅的な後戻り:

(?:[^ ]+)+\.

は役に立たない構造です -[^ ]+\.まったく同じに一致し、バックトラックする傾向がありません。

2 つの量指定子を入れ子にすることで、ピリオドで終わらない文字列の実行時間が指数関数的に増加します。一部のブラウザーは、数百万サイクル後に正規表現一致を中止することを選択する場合がありますが、他のブラウザー (Chrome など) は試行を続けます。

于 2012-07-24T13:39:09.493 に答える
2

この式のため、壊滅的なバックトラッキングのケースのようです: (?:[^ ]+)+. 最初のものは機能するのに、2番目のものは機能しない理由がわかりません。

必要な正規表現は

url = new RegExp("https?://(?:[^ ]+)\\.", "i")
// or
url = /https?:\/\/(?:[^ ]+)+\./i

imgurl = new RegExp("https?://(?:[^ ]+)\\.(?:jpe?g|gif|png)", "i")
// or
imgurl = /https?:\/\/(?:[^ ]+)+\.(?:jpe?g|gif|png)/i
于 2012-07-24T13:38:51.240 に答える