1

URLを検証する正規表現があります

/(^$|^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$)/

これは、検証エラーをスローするのではなく、たとえばハッシュ記号を許可しないという意味で正しくないことはわかっていますが、アプリをクラッシュさせるだけです。また、独立した正規表現テスターをクラッシュさせたようです。

テストに使用した URL はhttp://www.wmagazine.com/celebrities/2012/10/jennifer-lawrence-actress-katniss-everdeen-hunger-games-cover-story-ss#slide=1です。

理由を明らかにできる人はいますか?

コード コンテキストは、ユーザーがページにレンダリングするために入力した URL を検証するモデル内で使用されます。

validates :source_link, :format => { :with => /(^$|^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$)/,
                                   :message => 'Only valid urls allowed' }, :if => :apply_validations?
4

2 に答える 2

8

物事をクラッシュさせる問題はここにあります:

/(^$|^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$)/
                                                 ^^^^^^^^^^^^^^

量指定子をネストしており、正規表現には有効な一致を見つけるにはあまりにも多くの可能性があります。これは壊滅的なバックトラッキングと呼ばれます

これは、まったく同じ文字列に一致します。

/(^$|^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)\/?$)/

一致しないと、はるかに早く失敗します。

于 2013-05-23T21:31:16.060 に答える
0

これは仕事をするはずです:

^(?:https?:\/\/)?(?:[\da-z\.-]+)\.(?:[a-z\.]{2,6})(?:[\/\w \.#=-]*)\/?$

これが URL と一致するのが「良い」かどうかは非常に疑わしいですが、他の回答を確認することをお勧めします。

オンラインデモ1デモ2

于 2013-05-23T21:31:33.280 に答える