Ben another question cevapları dayanarak http://daringfireball.net/2010/07/improved_regex_for_matching_urlsBu normal ifadeyi nasıl "felaket geri dönüşü" ile sonuçlanamaz?
(?xi)
\b
( # Capture 1: entire matched URL
(?:
https?:// # http or https protocol
| # or
www\d{0,3}[.] # "www.", "www1.", "www2." … "www999."
| # or
[a-z0-9.\-]+[.][a-z]{2,4}/ # looks like domain name followed by a slash
)
(?: # One or more:
[^\s()<>]+ # Run of non-space, non-()<>
| # or
\(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels
)+
(?: # End with:
\(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels
| # or
[^\s`!()\[\]{};:'".,<>?«»“”‘’] # not a space or one of these punct chars
)
)
aldığım düzenli ifade ile eşleşen bir URL kullanmaya çalışıyorum, backtrack catastrophically bu regex neden durumlar vardır anlaşılmaktadır. Örneğin:
(?: # One or more:
[^\s()<>]+ # Run of non-space, non-()<>
| # or
\(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels
)+
:
var re = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/i;
re.test("http://google.com/?q=(AAAAAAAAAAAAAAAAAAAAAAAAAAAAA)")
... sorun bu kod bölümünün bulunduğunu
Bana öyle geliyor (Chrome'da örneğin) yürütmek için gerçekten uzun bir zaman alabilir
... hangi (.+)+
içeren gibi o önlemek olacaktır yapabilir bir değişiklik var mı görünüyor ki, (.+|\((.+|(\(.+\)))*\))+
kabaca eşdeğer gibi görünüyor?
Gerçekten, bu regex'i atmanız ve ihtiyacınız olanı yapan bir tane ile gelmeniz gerekir. Henüz bir uygulama görmedim, her ikisi de URL ayrıştırma için bir regex kullanacak kadar kabarık (gerçek ayrıştırıcı yerine) ve bir URL'de iç içe parantezleri işlemek için yeterince ciddi. "Https?: //" ile başlayıp, doğru bir URL'de% -encoded olması gereken ilk karakterle biten, ancak hemen hemen her şeyi işleme koyamayacak ve regex eşleştiricisinin üstele gitmesine neden olmayacaktır. –
Rubular'ı denediniz mi? Altında kullanışlı bir hile sayfası vardır ve çalıştığından emin olmak için her türlü test ifadesini ekleyebilirsiniz. (P.S. Bunun js için olduğunu biliyorum, ancak yine de bu kullanışlı bir kaynak.) Http://rubular.com/ – Edwin