मैं एक यूआरएल नियमित अभिव्यक्ति मिलान कि मैं another question को http://daringfireball.net/2010/07/improved_regex_for_matching_urlsमैं इस नियमित अभिव्यक्ति को "विनाशकारी बैकट्रैकिंग" के परिणामस्वरूप कैसे बना सकता हूं?
(?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
)
)
से मिला जवाब के आधार पर उपयोग करने के लिए कोशिश कर रहा हूँ, ऐसा लगता है ऐसे मामले हैं कि backtrack catastrophically को यह regex का कारण रहे हैं। उदाहरण के लिए:
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)")
... एक बहुत लंबे समय निष्पादित करने के लिए (उदाहरण के लिए क्रोम में) ले जा सकते हैं
मुझे ऐसा लगता है कि इस समस्या कोड के इस हिस्से में निहित है:
(?: # One or more:
[^\s()<>]+ # Run of non-space, non-()<>
| # or
\(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels
)+
... जो मोटे तौर पर (.+|\((.+|(\(.+\)))*\))+
के बराबर होने का है, जो लगता है कि यह (.+)+
शामिल इसमें कोई परिवर्तन मैं कर सकते हैं कि उस से बचने जाएगा है लगता है?
वास्तव में, आपको इस रेगेक्स को दूर फेंक देना चाहिए और जो आपको चाहिए वह एक के साथ आना चाहिए। मैंने अभी तक एक एप्लिकेशन नहीं देखा है जो यूआरएल पार्सिंग (वास्तविक पार्सर के बजाए) के लिए रेगेक्स का उपयोग करने के लिए पर्याप्त रूप से पर्याप्त है और यह गंभीर है कि इसे यूआरएल में नेस्टेड कोष्ठक को संभालने की ज़रूरत है। "Https?: //" से शुरू हो रहा है और पहले वर्ण पर समाप्त होना चाहिए जो उचित यूआरएल में% -कोड किया जाना चाहिए, लेकिन लगभग सबकुछ संभाल नहीं पाएगा, और रेगेक्स मैचर को घातीय होने का कारण नहीं बनता है। –
क्या आपने रूबुलर की कोशिश की है? इसके नीचे एक आसान धोखा शीट है, और यह सुनिश्चित करने के लिए कि आप काम करते हैं, आप सभी प्रकार के परीक्षण अभिव्यक्ति जोड़ सकते हैं। (पीएस मुझे पता है कि यह जेएस के लिए है, लेकिन फिर भी यह एक आसान संसाधन है।) Http://rubular.com/ – Edwin